diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index b38105fbb9..4a444aec31 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -15,7 +15,7 @@ jobs: last_version: ${{ steps.last_version.outputs.version }} token_exists: ${{ steps.check_token.outputs.token }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 50 # Check if the package.json version field has changed since the last push @@ -40,8 +40,8 @@ jobs: # We only want to publish if the package.json version field has changed if: needs.get-version.outputs.current_version != needs.get-version.outputs.last_version && needs.get-version.outputs.token_exists == 'true' steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v6 + - uses: actions/setup-node@v6 with: node-version: 18 cache: 'npm' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9884a87c4c..861d79c597 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -28,12 +28,12 @@ jobs: node-version: ['18.x'] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 100 # assumes PR/push to master is no larger than 100 commits. Other solutions are needlessly complex. - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} cache: 'npm' @@ -43,7 +43,7 @@ jobs: - name: Determine which files to lint (if pull request) if: ${{ github.event_name == 'pull_request' }} id: changed-files - uses: tj-actions/changed-files@v35 + uses: tj-actions/changed-files@v47 with: files: | ./config/*.ts @@ -66,7 +66,7 @@ jobs: - name: Determine whether test/sim or test/random-battles need to run (if pull request) if: ${{ github.event_name == 'pull_request' }} id: changed-directories - uses: tj-actions/changed-files@v35 + uses: tj-actions/changed-files@v47 with: files: | config/formats.ts diff --git a/.github/workflows/update_version.yml b/.github/workflows/update_version.yml index 413613f1af..b102c1b847 100644 --- a/.github/workflows/update_version.yml +++ b/.github/workflows/update_version.yml @@ -21,9 +21,9 @@ jobs: update_version: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: node-version: 18 cache: 'npm' @@ -34,7 +34,7 @@ jobs: npm version ${{ github.event.inputs.version }} --no-git-tag-version echo "new_version=$(jq -r .version package.json)" >> "$GITHUB_OUTPUT" - - uses: peter-evans/create-pull-request@v7 + - uses: peter-evans/create-pull-request@v8 with: title: Bump package.json version to v${{ steps.bump_version.outputs.new_version }} body: | 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/PROTOCOL.md b/PROTOCOL.md index 2d44c2136b..695a8ec631 100644 --- a/PROTOCOL.md +++ b/PROTOCOL.md @@ -7,9 +7,9 @@ Pokémon Showdown is implemented in SockJS. SockJS is a compatibility layer over raw WebSocket, so you can actually connect to Pokémon Showdown directly using WebSocket: - ws://sim.smogon.com:8000/showdown/websocket - or wss://sim3.psim.us/showdown/websocket + or + ws://sim3.psim.us:8000/showdown/websocket Client implementations you might want to look at for reference include: 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..c5a7a900e6 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 /////////////////////////////////////////////////////////////////// @@ -134,8 +112,9 @@ export const Formats: import('../sim/dex-formats').FormatList = [ ruleset: ['Little Cup', 'Standard'], banlist: [ 'Aipom', 'Basculin-White-Striped', 'Cutiefly', 'Diglett-Base', 'Dunsparce', 'Duraludon', 'Flittle', 'Gastly', 'Girafarig', 'Gligar', - 'Magby', 'Meditite', 'Misdreavus', 'Murkrow', 'Porygon', 'Qwilfish-Hisui', 'Rufflet', 'Scraggy', 'Scyther', 'Sneasel', 'Sneasel-Hisui', - 'Snivy', 'Stantler', 'Torchic', 'Voltorb-Hisui', 'Vulpix', 'Vulpix-Alola', 'Yanma', 'Moody', 'Heat Rock', 'Baton Pass', 'Sticky Web', + 'Magby', 'Meditite', 'Misdreavus', 'Murkrow', 'Porygon', 'Qwilfish-Hisui', 'Rufflet', 'Scraggy', 'Scyther', 'Shellder', 'Sneasel', + 'Sneasel-Hisui', 'Snivy', 'Stantler', 'Torchic', 'Voltorb-Hisui', 'Vulpix', 'Vulpix-Alola', 'Yanma', 'Moody', 'Heat Rock', 'Baton Pass', + 'Sticky Web', ], }, { @@ -161,7 +140,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 +147,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,44 +234,28 @@ export const Formats: import('../sim/dex-formats').FormatList = [ restricted: ['Restricted Legendary'], }, { - name: "[Gen 9] VGC 2025 Reg I", + name: "[Gen 9] VGC 2026 Reg F", + mod: 'gen9', gameType: 'doubles', searchShow: false, bestOfDefault: true, + ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 9', 'VGC Timer', 'Open Team Sheets'], + }, + { + 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', 'Open Team Sheets', 'Limit Two Restricted'], restricted: ['Restricted Legendary'], }, { - name: "[Gen 9] VGC 2025 Reg J", + name: "[Gen 9] VGC 2026 Reg I (Bo3)", 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'], - }, - { - name: "[Gen 9] VGC 2026 Reg F", - - mod: 'gen9', - gameType: 'doubles', - bestOfDefault: true, - ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 9', 'VGC Timer', 'Open Team Sheets'], - }, - { - name: "[Gen 9] VGC 2026 Reg F (Bo3)", - - mod: 'gen9', - gameType: 'doubles', - ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 9', 'VGC Timer', 'Force Open Team Sheets', 'Best of = 3'], + restricted: ['Restricted Legendary'], }, { name: "[Gen 9] Doubles Custom Game", @@ -305,7 +268,50 @@ export const Formats: import('../sim/dex-formats').FormatList = [ ruleset: ['Team Preview', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'], }, - // S/V Doubles + // Champions + /////////////////////////////////////////////////////////////////// + + { + section: "Champions", + }, + { + name: "[Gen 9 Champions] OU", + mod: 'champions', + ruleset: ['Standard'], + banlist: ['AG', 'Uber', 'Moody', 'Baton Pass', 'Last Respects', 'Shed Tail'], + }, + { + name: "[Gen 9 Champions] BSS Reg M-A", + mod: 'champions', + bestOfDefault: true, + ruleset: ['Flat Rules', 'VGC Timer'], + }, + { + name: "[Gen 9 Champions] VGC 2026 Reg M-A", + mod: 'champions', + gameType: 'doubles', + bestOfDefault: true, + ruleset: ['Flat Rules', 'VGC Timer', 'Open Team Sheets'], + }, + { + name: "[Gen 9 Champions] VGC 2026 Reg M-A (Bo3)", + mod: 'champions', + gameType: 'doubles', + ruleset: ['Flat Rules', 'VGC Timer', 'Force Open Team Sheets', 'Best of = 3'], + }, + { + name: "[Gen 9 Champions] Custom Game", + mod: 'champions', + searchShow: false, + debug: true, + battle: { trunc: Math.trunc }, + ruleset: ['Team Preview', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 50'], + onBegin() { + this.reportPercentages = true; + }, + }, + + // Unofficial Metagames /////////////////////////////////////////////////////////////////// { @@ -325,7 +331,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', ], }, { @@ -344,26 +350,26 @@ export const Formats: import('../sim/dex-formats').FormatList = [ 'Zekrom', 'Commander', 'Moody', 'Focus Sash', 'King\'s Rock', 'Razor Fang', 'Ally Switch', 'Final Gambit', 'Perish Song', 'Swagger', ], }, + { + name: "[Gen 9] 4v4 Doubles UU", + desc: "VGC rules, but only Pokémon that get less than 4.52% usage on the VGC ladder are legal, as well as a few other guidelines.", + mod: 'gen9', + gameType: 'doubles', + searchShow: false, + bestOfDefault: true, + ruleset: ['[Gen 9] VGC 2026 Reg F', 'Evasion Abilities Clause', 'Evasion Moves Clause', 'OHKO Clause'], + banlist: [ + 'Amoonguss', 'Annihilape', 'Arcanine-Hisui', 'Basculegion-M', 'Chi-Yu', 'Chien-Pao', 'Cresselia', 'Dondozo', 'Dragonite', 'Enamorus-Incarnate', 'Farigiraf', 'Flutter Mane', + 'Gholdengo', 'Gouging Fire', 'Incineroar', 'Indeedee-F', 'Iron Crown', 'Landorus-Incarnate', 'Landorus-Therian', 'Ogerpon-Cornerstone', 'Ogerpon-Hearthflame', 'Ogerpon-Wellspring', + 'Porygon2', 'Raging Bolt', 'Regidrago', 'Rillaboom', 'Roaring Moon', 'Sneasler', 'Ting-Lu', 'Torkoal', 'Tornadus-Incarnate', 'Ursaluna-Base', 'Urshifu-Single-Strike', + 'Urshifu-Rapid-Strike', 'Whimsicott', 'Commander', 'Bright Powder', 'King\'s Rock', 'Razor Fang', + ], + }, { name: "[Gen 9] Anything Goes", 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', @@ -376,7 +382,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ gameType: 'freeforall', rated: false, tournamentShow: false, - ruleset: ['Standard', 'Sleep Moves Clause', '!Sleep Clause Mod', '!Evasion Items Clause'], + ruleset: ['Standard', 'Sleep Moves Clause', '!Sleep Clause Mod', '!Evasion Items Clause', '!Species Clause'], banlist: [ 'Annihilape', 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dondozo', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Iron Bundle', 'Koraidon', 'Kyogre', 'Kyurem-White', @@ -393,11 +399,10 @@ 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', 'Impidimp', 'Koffing', 'Mareanie', 'Mienfoo', 'Mudbray', 'Larvesta', + 'Pawniard', 'Sandshrew-Alola', 'Shellos', 'Stunky', 'Tentacool', 'Tinkatink', 'Toedscool', 'Trapinch', 'Vullaby', 'Wingull', 'Zorua-Hisui', // LC UUBL - 'Deerling', 'Minccino', + 'Deerling', 'Minccino', 'Light Clay', ], }, { @@ -407,9 +412,24 @@ export const Formats: import('../sim/dex-formats').FormatList = [ searchShow: false, ruleset: ['Standard OMs', 'Not Fully Evolved', 'Sleep Moves Clause', 'Terastal Clause'], banlist: [ - 'Basculin-White-Striped', 'Bisharp', 'Chansey', 'Combusken', 'Dipplin', 'Duraludon', 'Electabuzz', 'Gligar', 'Gurdurr', - 'Haunter', 'Magmar', 'Magneton', 'Misdreavus', 'Porygon2', 'Primeape', 'Qwilfish-Hisui', 'Rhydon', 'Scyther', 'Sneasel', - 'Sneasel-Hisui', 'Ursaring', 'Vigoroth', 'Vulpix-Base', 'Arena Trap', 'Magnet Pull', 'Moody', 'Shadow Tag', 'Baton Pass', + 'Basculin-White-Striped', 'Bisharp', 'Chansey', 'Combusken', 'Dipplin', 'Duraludon', 'Dusclops', 'Electabuzz', 'Gligar', 'Gurdurr', + 'Haunter', 'Magmar', 'Magneton', 'Misdreavus', 'Porygon2', 'Primeape', 'Qwilfish-Hisui', 'Rhydon', 'Scyther', 'Sneasel', 'Sneasel-Hisui', + 'Ursaring', 'Vigoroth', 'Vulpix-Base', 'Arena Trap', 'Magnet Pull', 'Moody', 'Shadow Tag', 'Baton Pass', + ], + }, + { + 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', 'Blissey', 'Calyrex-Ice', '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', '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', 'Rayquaza', 'Shaymin-Sky', 'Spectrier', + 'Zacian', 'Zekrom', ], }, @@ -467,6 +487,13 @@ export const Formats: import('../sim/dex-formats').FormatList = [ ruleset: ['[Gen 9] NatDex Draft', 'Item Clause = 2', 'Little Cup'], banlist: ['Dragon Rage', 'Sonic Boom'], }, + { + name: "[Gen 9 Champions] Draft", + mod: 'champions', + searchShow: false, + itemClauseDefault: true, + ruleset: ['Standard Draft'], + }, { name: "[Gen 8] Draft", mod: 'gen8', @@ -496,22 +523,25 @@ export const Formats: import('../sim/dex-formats').FormatList = [ name: "[Gen 6] Draft", mod: 'gen6', searchShow: false, - ruleset: ['Standard Draft', 'Moody Clause', 'Swagger Clause'], - banlist: ['Soul Dew'], + ruleset: ['Standard Draft'], + banlist: ['Moody', 'Soul Dew', 'Swagger'], }, { name: "[Gen 5] Draft", mod: 'gen5', searchShow: false, - ruleset: ['Standard Draft', '-Unreleased', 'Moody Clause', 'Swagger Clause', 'DryPass Clause', 'Gems Clause', 'Sleep Moves Clause'], - banlist: ['King\'s Rock', 'Quick Claw', 'Soul Dew', 'Assist', 'Drizzle ++ Swift Swim', 'Drought ++ Chlorophyll', 'Sand Stream ++ Sand Rush', 'Landorus + Sheer Force', 'Excadrill + Sand Rush'], + ruleset: ['Standard Draft', '-Unreleased', 'DryPass Clause', 'Gems Clause', 'Sleep Moves Clause'], + banlist: [ + 'Moody', 'King\'s Rock', 'Quick Claw', 'Soul Dew', 'Assist', 'Swagger', 'Drizzle ++ Swift Swim', + 'Drought ++ Chlorophyll', 'Sand Stream ++ Sand Rush', 'Landorus + Sheer Force', 'Excadrill + Sand Rush', + ], }, { name: "[Gen 4] Draft", mod: 'gen4', searchShow: false, - ruleset: ['Standard Draft', 'Swagger Clause', 'DryPass Clause', '!Team Preview', '!Evasion Abilities Clause', 'Accuracy Moves Clause'], - banlist: ['King\'s Rock', 'Quick Claw', 'Assist', 'Sand Stream ++ Sand Veil', 'Snow Warning ++ Snow Cloak', 'No Guard + Dynamic Punch'], + ruleset: ['Standard Draft', 'DryPass Clause', '!Team Preview', '!Evasion Abilities Clause', 'Accuracy Moves Clause'], + banlist: ['King\'s Rock', 'Quick Claw', 'Assist', 'Swagger', 'Sand Stream ++ Sand Veil', 'Snow Warning ++ Snow Cloak', 'No Guard + Dynamic Punch'], }, { name: "[Gen 3] Draft", @@ -520,533 +550,27 @@ 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.`, - 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'], - }, - { - 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.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.`]; - } - } - 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.`]; - } - } - 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; - } - } - 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); - } - } - }, + name: "[Gen 9] Godly Gift Random Battle", + desc: `Each Pokémon receives one base stat from the God in the first slot depending on its position in the team.`, + team: 'randomGodlyGift', + ruleset: ['[Gen 9] Random Battle', 'Godly Gift Mod', 'Team Preview'], 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); - } - } + this.add(`raw|
In this format, the "God" in the first slot has "gifted" (shared) its base attack to the Pokémon in the second slot, defense to the one in the third slot, etc."`); }, }, - { - 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.`, - mod: 'gen9', - ruleset: ['Standard NatDex', 'Terastal Clause', '!Obtainable Moves', '!Team Preview', 'Camomons Mod', 'CFZ Clause', 'Sleep Moves Clause', 'Team Type Preview'], - 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', - ], - unbanlist: ['Blazing Torque', 'Combat Torque', 'Light of Ruin', 'Magical Torque', 'Noxious Torque', 'Wicked Torque'], - }, - - // Other Metagames - /////////////////////////////////////////////////////////////////// - - { - section: "Other Metagames", - column: 2, - }, - { - name: "[Gen 9] Almost Any Ability", - desc: `Pokémon have access to almost any ability.`, - mod: 'gen9', - ruleset: ['Standard OMs', '!Obtainable Abilities', 'Ability Clause = 1', 'Sleep Moves Clause', 'Terastal Clause'], - banlist: [ - 'Annihilape', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Ceruledge', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Dragonite', - 'Enamorus-Incarnate', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Iron Bundle', 'Iron Valiant', 'Keldeo', - 'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern', - 'Palkia', 'Palkia-Origin', 'Raging Bolt', 'Rayquaza', 'Regigigas', 'Reshiram', 'Shaymin-Sky', 'Slaking', 'Sneasler', 'Solgaleo', 'Spectrier', 'Urshifu', 'Urshifu-Rapid-Strike', - 'Volcarona', 'Walking Wake', 'Weavile', 'Zacian', 'Zacian-Crowned', 'Zekrom', 'Arena Trap', 'Comatose', 'Contrary', 'Fur Coat', 'Good as Gold', 'Gorilla Tactics', 'Huge Power', - 'Ice Scales', 'Illusion', 'Imposter', 'Innards Out', 'Magic Bounce', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Orichalcum Pulse', 'Parental Bond', 'Poison Heal', 'Pure Power', - 'Shadow Tag', 'Simple', 'Speed Boost', 'Stakeout', 'Toxic Debris', 'Triage', 'Unburden', 'Water Bubble', 'Wonder Guard', 'King\'s Rock', 'Razor Fang', 'Baton Pass', - 'Last Respects', 'Shed Tail', - ], - }, - { - name: "[Gen 9] Balanced Hackmons", - desc: `Anything directly hackable onto a set (EVs, IVs, forme, ability, item, and move) and is usable in local battles is allowed.`, - mod: 'gen9', - ruleset: [ - 'OHKO Clause', 'Evasion Clause', 'Species Clause', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Moves Clause', - 'Endless Battle Clause', 'Hackmons Forme Legality', 'Species Reveal Clause', 'Terastal Clause', - ], - banlist: [ - 'Calyrex-Shadow', 'Deoxys-Attack', 'Diancie-Mega', 'Gengar-Mega', 'Groudon-Primal', 'Kartana', 'Mewtwo-Mega-X', 'Mewtwo-Mega-Y', 'Rayquaza-Mega', - 'Regigigas', 'Shedinja', 'Slaking', 'Arena Trap', 'Contrary', 'Gorilla Tactics', 'Hadron Engine', 'Huge Power', 'Illusion', 'Innards Out', 'Libero', - 'Liquid Ooze', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Orichalcum Pulse', 'Parental Bond', 'Poison Heal', 'Protean', 'Pure Power', 'Shadow Tag', - 'Stakeout', 'Water Bubble', 'Wonder Guard', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Belly Drum', 'Ceaseless Edge', 'Clangorous Soul', 'Dire Claw', - 'Electro Shot', 'Fillet Away', 'Imprison', 'Last Respects', 'Lumina Crash', 'No Retreat', 'Photon Geyser', 'Power Trip', 'Quiver Dance', 'Rage Fist', - 'Revival Blessing', 'Shed Tail', 'Sleep Talk', 'Substitute', 'Shell Smash', 'Tail Glow', - ], - }, - { - name: "[Gen 9] Godly Gift", - desc: `Each Pokémon receives one base stat from a God (Restricted Pokémon) depending on its position in the team. If there is no restricted Pokémon, it uses the Pokémon in the first slot.`, - mod: 'gen9', - ruleset: ['Standard OMs', 'Evasion Abilities Clause', 'Evasion Items Clause', 'Sleep Moves Clause', 'Godly Gift Mod'], - banlist: [ - 'Blissey', 'Calyrex-Shadow', 'Chansey', 'Deoxys-Attack', 'Koraidon', 'Kyurem-Black', 'Miraidon', 'Arena Trap', 'Gale Wings', 'Huge Power', 'Moody', 'Pure Power', 'Shadow Tag', - 'Swift Swim', 'Focus Band', 'King\'s Rock', 'Quick Claw', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Shed Tail', - ], - restricted: [ - 'Alomomola', 'Annihilape', 'Araquanid', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Chien-Pao', 'Chi-Yu', 'Crawdaunt', 'Deoxys-Normal', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Dragapult', - 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gliscor', 'Gouging Fire', 'Groudon', 'Hawlucha', 'Ho-Oh', 'Iron Bundle', 'Iron Hands', 'Kingambit', 'Kyogre', - 'Kyurem', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin', 'Raging Bolt', - 'Rayquaza', 'Regieleki', 'Reshiram', 'Serperior', 'Shaymin-Sky', 'Smeargle', 'Solgaleo', 'Spectrier', 'Terapagos', 'Toxapex', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Volcarona', 'Zacian', - 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', - ], - }, - { - name: "[Gen 9] Mix and Mega", - desc: `Mega evolve any Pokémon with any mega stone, or transform them with 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', - ruleset: ['Standard OMs', 'Evasion Items Clause', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Terastal Clause'], - banlist: [ - 'Calyrex-Shadow', 'Koraidon', 'Kyogre', 'Miraidon', 'Moody', 'Shadow Tag', 'Beedrillite', 'Blazikenite', 'Gengarite', - 'Kangaskhanite', 'Lucarionite Z', 'Malamarite', 'Mawilite', 'Medichamite', 'Pidgeotite', 'Red Orb', 'Baton Pass', - 'Shed Tail', - ], - restricted: [ - 'Arceus', 'Basculegion-M', 'Calyrex-Ice', 'Ceruledge', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Eternatus', 'Flutter Mane', - 'Gengar', 'Gholdengo', 'Giratina', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Kyurem-Black', 'Kyurem-White', 'Lugia', - 'Lunala', 'Manaphy', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza', 'Regigigas', 'Reshiram', - 'Slaking', 'Sneasler', 'Solgaleo', 'Ursaluna-Bloodmoon', 'Urshifu-Single-Strike', 'Walking Wake', 'Zacian', 'Zekrom', - ], - 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] Shared Power", - desc: `Once a Pokémon switches in, its ability is shared with the rest of the team.`, - mod: 'sharedpower', - ruleset: ['Standard OMs', 'Evasion Abilities Clause', 'Evasion Items Clause', 'Sleep Moves Clause'], - banlist: [ - 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Conkeldurr', 'Deoxys-Attack', 'Eternatus', 'Greninja', 'Kingambit', 'Kyogre', 'Kyurem-Black', - 'Kyurem-White', 'Koraidon', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Rayquaza', - 'Regieleki', 'Reshiram', 'Rillaboom', 'Scizor', 'Shaymin-Sky', 'Spectrier', 'Sneasler', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', - 'Arena Trap', 'Moody', 'Neutralizing Gas', 'Shadow Tag', 'Speed Boost', 'Stench', 'Swift Swim', 'King\'s Rock', 'Leppa Berry', 'Razor Fang', 'Starf Berry', - 'Baton Pass', 'Extreme Speed', 'Last Respects', - ], - unbanlist: ['Arceus-Bug', 'Arceus-Dragon', 'Arceus-Fire', 'Arceus-Ice'], - restricted: [ - 'Armor Tail', 'Chlorophyll', 'Comatose', 'Contrary', 'Dazzling', 'Fur Coat', 'Gale Wings', 'Good as Gold', 'Huge Power', 'Ice Scales', 'Illusion', 'Imposter', - 'Magic Bounce', 'Magic Guard', 'Magnet Pull', 'Mold Breaker', 'Multiscale', 'Poison Heal', 'Prankster', 'Protosynthesis', 'Psychic Surge', 'Pure Power', - 'Quark Drive', 'Queenly Majesty', 'Quick Draw', 'Quick Feet', 'Regenerator', 'Sand Rush', 'Simple', 'Slush Rush', 'Stakeout', 'Stamina', 'Sturdy', - 'Surge Surfer', 'Technician', 'Tinted Lens', 'Triage', 'Unaware', 'Unburden', 'Water Bubble', - ], - onValidateRule() { - if (this.format.gameType !== 'singles') { - throw new Error(`Shared Power currently does not support ${this.format.gameType} battles.`); - } - }, - getSharedPower(pokemon) { - const sharedPower = new Set(); - for (const ally of pokemon.side.pokemon) { - if (pokemon.battle.ruleTable.isRestricted(`ability:${ally.baseAbility}`)) continue; - if (ally.previouslySwitchedIn > 0) { - if (pokemon.battle.dex.currentMod !== 'sharedpower' && ['trace', 'mirrorarmor'].includes(ally.baseAbility)) { - sharedPower.add('noability'); - continue; - } - sharedPower.add(ally.baseAbility); - } - } - sharedPower.delete(pokemon.baseAbility); - return sharedPower; - }, - onBeforeSwitchIn(pokemon) { - let format = this.format; - if (!format.getSharedPower) format = this.dex.formats.get('gen9sharedpower'); - for (const ability of format.getSharedPower!(pokemon)) { - const effect = 'ability:' + this.toID(ability); - pokemon.volatiles[effect] = this.initEffectState({ id: effect, target: pokemon }); - if (!pokemon.m.abils) pokemon.m.abils = []; - if (!pokemon.m.abils.includes(effect)) pokemon.m.abils.push(effect); - } - }, - }, - { - name: "[Gen 9] STABmons", - desc: `Pokémon can use any move of their typing, in addition to the moves they can normally learn.`, - mod: 'gen9', - ruleset: ['Standard OMs', 'STABmons Move Legality', 'Sleep Moves Clause', 'Terastal Clause'], - banlist: [ - 'Arceus', 'Azumarill', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dragapult', - 'Dragonite', 'Enamorus-Incarnate', 'Eternatus', 'Flutter Mane', 'Garchomp', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Gyarados', 'Ho-Oh', 'Iron Bundle', - 'Komala', 'Koraidon', 'Kyogre', 'Kyurem-Base', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Meloetta', 'Mewtwo', 'Miraidon', - 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Ogerpon-Wellspring', 'Palkia', 'Palkia-Origin', 'Porygon-Z', 'Rayquaza', 'Reshiram', 'Roaring Moon', - 'Shaymin-Sky', 'Solgaleo', 'Spectrier', 'Terapagos', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Urshifu-Single-Strike', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', - 'Zoroark-Hisui', 'Arena Trap', 'Moody', 'Shadow Tag', 'Damp Rock', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Shed Tail', - ], - restricted: [ - 'Astral Barrage', 'Belly Drum', 'Ceaseless Edge', 'Clangorous Soul', 'Combat Torque', 'Dire Claw', 'Dragon Energy', 'Electro Shot', 'Esper Wing', 'Extreme Speed', 'Fillet Away', - 'Final Gambit', 'Flower Trick', 'Gigaton Hammer', 'No Retreat', 'Rage Fist', 'Revival Blessing', 'Shell Smash', 'Shift Gear', 'Torch Song', 'Triple Arrows', 'V-create', - 'Victory Dance', 'Water Shuriken', 'Wicked Blow', 'Wicked Torque', - ], - }, - { - name: "[Gen 7] Pure Hackmons", - desc: `Anything that can be hacked in-game and is usable in local battles is allowed.`, - mod: 'gen7', - ruleset: ['-Nonexistent', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause'], - }, - - // Challengeable OMs - /////////////////////////////////////////////////////////////////// - - { - section: "Challengeable OMs", - column: 2, - }, - { - name: "[Gen 9] 1-2 Switch", - desc: `Doubles-based metagame where each Pokémon takes turns being "active" every few turns.`, - mod: 'gen9', - gameType: 'doubles', - searchShow: false, - ruleset: ['Standard OMs', 'Gravity Sleep Clause'], - banlist: [ - 'Annihilape', 'Arceus', 'Basculegion-M', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darkrai', 'Deoxys-Attack', 'Deoxys-Normal', 'Dialga', 'Dialga-Origin', 'Eternatus', 'Flutter Mane', - 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Lugia', 'Lunala', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', - 'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Tatsugiri', 'Terapagos', 'Urshifu', 'Urshifu-Rapid-Strike', 'Zacian', 'Zacian-Crowned', 'Zamazenta', - 'Zamazenta-Crowned', 'Moody', 'Shadow Tag', - ], - battle: { - endTurn() { - // @ts-expect-error Hack - for (const pokemon of this.getAllActive(false, true)) { - // turn counter hasn't been incremented yet - if (this.turn & 1 && pokemon.position === (this.turn & 2 ? 0 : 1) && pokemon.hp && pokemon.allies().length) { - pokemon.volatiles['commanding'] = this.initEffectState({ id: 'commanding', name: 'Commanding', target: pokemon }); - pokemon.volatiles['gastroacid'] = this.initEffectState({ id: 'gastroacid', name: 'Gastro Acid', target: pokemon }); - this.add('-message', `${pokemon.side.name}'s ${pokemon.name !== pokemon.species.name ? `${pokemon.name} (${pokemon.species.name})` : pokemon.name} will be skipped next turn.`); - } else { - pokemon.removeVolatile('commanding'); - pokemon.removeVolatile('gastroacid'); - } - } - this.constructor.prototype.endTurn.call(this); - }, - getAllActive(includeFainted, includeCommanding) { - const pokemonList: Pokemon[] = []; - for (const side of this.sides) { - for (const pokemon of side.active) { - if (pokemon && (includeFainted || !pokemon.fainted) && (includeCommanding || !pokemon.volatiles['commanding'])) { - pokemonList.push(pokemon); - } - } - } - return pokemonList; - }, - }, - side: { - allies(all?: boolean) { - let allies = this.active.filter(ally => ally); - if (!all) allies = allies.filter(ally => ally.hp && !ally.volatiles['commanding']); - return allies; - }, - }, - }, - { - name: "[Gen 9] 350 Cup", - desc: `Pokemon with a BST of 350 or lower have their stats doubled.`, - mod: 'gen9', - searchShow: false, - ruleset: ['Standard OMs', 'Sleep Moves Clause', '350 Cup Mod', 'Evasion Clause'], - banlist: ['Calyrex-Shadow', 'Flittle', 'Gastly', 'Miraidon', 'Pikachu', 'Rufflet', 'Arena Trap', 'Moody', 'Shadow Tag', 'Eviolite', 'Baton Pass'], - }, { name: "[Gen 9] Alphabet Cup", desc: `Allows Pokémon to use any move that shares the same first letter as their name or a previous evolution's name.`, mod: 'gen9', - searchShow: false, + // searchShow: false, ruleset: ['Standard OMs', 'Alphabet Cup Move Legality', 'Sleep Moves Clause', 'Terastal Clause'], banlist: [ 'Annihilape', 'Arceus', 'Baxcalibur', 'Blaziken', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Deoxys-Attack', 'Deoxys-Normal', 'Dialga', 'Dialga-Origin', @@ -1061,92 +585,11 @@ export const Formats: import('../sim/dex-formats').FormatList = [ 'Sacred Fire', 'Salt Cure', 'Shell Smash', 'Shift Gear', 'Surging Strikes', 'Tail Glow', 'Triple Arrows', ], }, - { - name: "[Gen 9] Bad 'n Boosted", - desc: `All base stats of 70 and lower are doubled.`, - searchShow: false, - ruleset: ['Standard', 'Bad \'n Boosted Mod', 'Sleep Moves Clause', '!Sleep Clause Mod'], - banlist: ['AG', 'Araquanid', 'Cyclizar', 'Espathra', 'Espeon', 'Pawmot', 'Polteageist', 'Huge Power', 'Moody', 'Pure Power', 'Shadow Tag', 'Eviolite', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Last Respects'], - }, - { - name: "[Gen 9] Battlefields", - desc: `Any field condition with a set duration becomes permanent once triggered unless directly replaced, removed, or reversed. Namely, this impacts screens, weathers, terrains, room effects, gravity, and side conditions like Tailwind and Safeguard.`, - mod: 'gen9', - searchShow: false, - ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Evasion Abilities Clause'], - banlist: [ - 'Annihilape', 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Deoxys-Attack', 'Deoxys-Normal', 'Dialga', 'Dialga-Origin', 'Espathra', - 'Eternatus', 'Flutter Mane', 'Gholdengo', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', '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', 'Reshiram', 'Shaymin-Sky', 'Sneasler', 'Spectrier', 'Terapagos', 'Urshifu', 'Urshifu-Rapid-Strike', 'Zacian', - 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Aurora Veil', 'Baton Pass', 'Fairy Lock', - 'Last Respects', 'Light Screen', 'Quick Guard', 'Reflect', 'Shed Tail', 'Tailwind', 'Trick Room', - ], - onWeatherChange() { - this.field.weatherState.duration = 0; - }, - onTerrainChange() { - this.field.terrainState.duration = 0; - }, - onPseudoWeatherChange(target, source, pseudoWeather) { - this.field.pseudoWeather[pseudoWeather.id].duration = 0; - }, - onSideConditionStart(side, source, sideCondition) { - side.sideConditions[sideCondition.id].duration = 0; - }, - }, - { - name: "[Gen 9] Camomons", - desc: `Pokémon have their types set to match their first two moves.`, - mod: 'gen9', - searchShow: false, - ruleset: ['Standard OMs', 'Sleep Clause Mod', 'Evasion Items Clause', 'Evasion Abilities Clause', 'Terastal Clause', 'Camomons Mod'], - banlist: [ - 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dragonite', 'Drednaw', - 'Enamorus-Incarnate', 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Kommo-o', 'Koraidon', 'Kyogre', - 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Manaphy', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', - 'Palafin', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Roaring Moon', 'Shaymin-Sky', 'Sneasler', 'Solgaleo', 'Spectrier', 'Tornadus-Therian', 'Ursaluna-Bloodmoon', - 'Volcarona', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'Booster Energy', 'King\'s Rock', 'Light Clay', 'Razor Fang', - 'Baton Pass', 'Last Respects', 'Shed Tail', - ], - }, - { - name: "[Gen 9] Category Swap", - desc: `All Special moves become Physical, and all Physical moves become Special.`, - mod: 'gen9', - searchShow: false, - ruleset: ['Standard OMs', 'Sleep Clause Mod', 'Category Swap Mod'], - banlist: [ - 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Eternatus', - 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Iron Valiant', 'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', - 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Regieleki', 'Reshiram', 'Roaring Moon', 'Solgaleo', - 'Spectrier', 'Terapagos', 'Volcarona', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'Damp Rock', 'King\'s Rock', - 'Razor Fang', 'Baton Pass', 'Draco Meteor', 'Last Respects', 'Overheat', 'Shed Tail', - ], - }, - { - name: "[Gen 9] Convergence", - desc: `Allows all Pokémon that have identical types to share moves and abilities.`, - mod: 'gen9', - searchShow: false, - ruleset: ['Standard OMs', 'Ability Clause = 1', 'Sleep Moves Clause', 'Convergence Legality', 'Terastal Clause', '!Obtainable Abilities'], - banlist: [ - 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Comfey', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Deoxys-Speed', - 'Dialga', 'Dialga-Origin', 'Dondozo', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Haxorus', 'Ho-oh', 'Inteleon', - 'Iron Bundle', 'Iron Hands', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lilligant-Hisui', 'Lugia', 'Lunala', - 'Magearna', 'Manaphy', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin', - 'Porygon-Z', 'Primarina', 'Rayquaza', 'Regieleki', 'Regigigas', 'Reshiram', 'Roaring Moon', 'Shaymin-Sky', 'Solgaleo', 'Slaking', 'Smeargle', 'Sneasler', - 'Spectrier', 'Umbreon', 'Urshifu-Single-Strike', 'Urshifu-Rapid-Strike', 'Walking Wake', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', - 'Zekrom', 'Arena Trap', 'Comatose', 'Contrary', 'Drizzle', 'Drought', 'Imposter', 'Moody', 'Pure Power', 'Shadow Tag', 'Speed Boost', 'Unburden', - 'King\'s Rock', 'Light Clay', 'Razor Fang', 'Baton Pass', 'Belly Drum', 'Boomburst', 'Extreme Speed', 'Final Gambit', 'Last Respects', 'Population Bomb', - 'Quiver Dance', 'Rage Fist', 'Shed Tail', 'Shell Smash', 'Spore', 'Transform', - ], - }, { name: "[Gen 9] Cross Evolution", desc: `Give a Pokémon a Pokémon name of the next evolution stage as a nickname to inherit stat changes, typing, abilities, and moves from the next stage Pokémon.`, mod: 'gen9', - searchShow: false, + // searchShow: false, ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Terastal Clause'], banlist: [ 'Basculin-White-Striped', 'Duraludon', 'Kyogre', 'Miraidon', 'Scyther', 'Sneasel', 'Sneasel-Hisui', 'Ursaring', 'Arena Trap', @@ -1270,6 +713,779 @@ export const Formats: import('../sim/dex-formats').FormatList = [ } }, }, + { + name: "[Gen 9] STAAABmons", + desc: `Pokémon have access to almost any ability and can use any move of their typing, in addition to the moves they can normally learn.`, + mod: 'gen9', + ruleset: ['Standard OMs', '!Obtainable Abilities', 'Ability Clause = 1', 'Evasion Items Clause', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Terastal Clause', 'STABmons Move Legality'], + banlist: [ + 'Annihilape', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Ceruledge', 'Chien-Pao', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Dragonite', + 'Enamorus-Incarnate', 'Eternatus', 'Flutter Mane', 'Garchomp', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Hoopa-Unbound', 'Ho-Oh', 'Iron Bundle', 'Iron Moth', 'Iron Valiant', + 'Keldeo', 'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Manaphy', 'Meloetta', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', + 'Noivern', 'Ogerpon-Cornerstone', 'Ogerpon-Hearthflame', 'Ogerpon-Wellspring', 'Palkia', 'Palkia-Origin', 'Raging Bolt', 'Rayquaza', 'Regigigas', 'Reshiram', 'Roaring Moon', 'Shaymin-Sky', + 'Slaking', 'Sneasler', 'Solgaleo', 'Spectrier', 'Thundurus', 'Thundurus-Therian', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Urshifu-Single-Strike', 'Urshifu-Rapid-Strike', 'Volcarona', 'Walking Wake', + 'Weavile', 'Zacian', 'Zacian-Crowned', 'Zekrom', 'Zoroark-Hisui', 'Arena Trap', 'Comatose', 'Contrary', 'Fur Coat', 'Good as Gold', 'Gorilla Tactics', 'Hadron Engine', 'Huge Power', 'Ice Scales', + 'Illusion', 'Imposter', 'Innards Out', 'Magic Bounce', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Orichalcum Pulse', 'Parental Bond', 'Poison Heal', 'Pure Power', 'Shadow Tag', 'Simple', + 'Speed Boost', 'Stakeout', 'Stench', 'Tangled Feet', 'Tinted Lens', 'Toxic Debris', 'Triage', 'Unburden', 'Water Bubble', 'Wonder Guard', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Last Respects', + 'Shed Tail', + ], + restricted: [ + 'Acupressure', 'Astral Barrage', 'Belly Drum', 'Boomburst', 'Ceaseless Edge', 'Clangorous Soul', 'Dire Claw', 'Dragon Energy', 'Electro Shot', 'Eruption', 'Esper Wing', 'Extreme Speed', + 'Fillet Away', 'Final Gambit', 'Gigaton Hammer', 'Glacial Lance', 'Jet Punch', 'Lumina Crash', 'No Retreat', 'Population Bomb', 'Rage Fist', 'Revival Blessing', 'Rising Voltage', 'Shell Smash', + 'Shift Gear', 'Surging Strikes', 'Tail Glow', 'Take Heart', 'Torch Song', 'Transform', 'Triple Arrows', 'V-create', 'Victory Dance', 'Water Spout', 'Wicked Blow', 'Wicked Torque', + ], + }, + { + name: "[Gen 9] Monocolor", + desc: `All Pokémon on a team must share a color.`, + mod: 'gen9', + ruleset: ['[Gen 9] OU', 'Same Color Clause'], + banlist: ['Ogerpon-Wellspring'], + unbanlist: ['Archaludon', 'Volcarona'], + }, + { + name: "[Gen 9] National Dex 35 Pokes", + desc: `Only 35 Pokémon are legal.`, + mod: 'gen9', + // searchShow: false, + ruleset: [ + 'Standard NatDex', + '!Species Clause', 'Forme Clause', 'Sleep Moves Clause', 'Terastal Clause', 'DryPass Clause', 'Mega Rayquaza Clause', + ], + 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', 'Booster Energy', 'King\'s Rock', 'Quick Claw', + 'Razor Fang', 'Hidden Power', 'Last Respects', 'Shed Tail', 'Baton Pass + Contrary', 'Baton Pass + Rapid Spin', 'Baton Pass + Well-Baked Body', + ], + unbanlist: [ + 'Articuno-Base', 'Brute Bonnet', 'Cacturne', 'Clefable-Base', 'Cobalion', 'Drifblim', 'Dugtrio-Base', 'Gabite', 'Gogoat', 'Hariyama', 'Hippowdon', 'Krookodile', + 'Lurantis-Base', 'Lycanroc-Base', 'Mabosstiff', 'Minior', 'Munkidori', 'Passimian', 'Pawmot', 'Persian-Base', 'Raichu-Alola', 'Roserade', 'Rotom-Heat', 'Sandaconda', + 'Sceptile-Base', 'Stoutland', 'Stunfisk-Base', 'Tentacruel', 'Thwackey', 'Tinkaton', 'Toedscruel', 'Tsareena', 'Uxie', 'Vivillon', 'Whiscash', + 'Ultranecrozium Z', 'Solganium Z', 'Lunalium Z', 'Mewnium Z', 'Marshadium Z', 'Yawn', + ], + // Stupid hardcode + onValidateSet(set, format, setHas, teamHas) { + if (set.item) { + const item = this.dex.items.get(set.item); + 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}`))) { + return [`${item.name} is banned.`]; + } + } + }, + }, + { + name: "[Gen 9] ReGeneration Random Battle", + desc: `A Kanto-only Gen 9 metagame where many of the Pokemon have been redesigned with modern design philosophies.`, + mod: 'gen9regeneration', + team: 'random', + bestOfDefault: true, + ruleset: ['Obtainable', 'Terastal Clause', 'Sleep Clause Mod', 'HP Percentage Mod', 'Cancel Mod', 'Illusion Level Mod', 'Data Preview'], + onBegin() { + this.add(`raw|
Need help with all of the new moves and abilities?
Then make sure to check out the spreadsheet or use /dt!
`); + this.add('-message', `Welcome to ReGeneration!`); + this.add('-message', `This is a Generation 9 Pet Mod where many Kanto Pokemon have been redesigned to fit the modern era!`); + this.add('-message', `You can find our thread and metagame resources here:`); + this.add('-message', `https://www.smogon.com/forums/threads/3718196/`); + }, + }, + { + 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 5] Ubers", + mod: 'gen5', + // searchShow: false, + ruleset: ['Standard', 'Sleep Clause Mod'], + }, + { + name: "[Gen 3] FRLG OU", + mod: 'gen3frlg', + ruleset: ['Standard', 'One Boost Passer Clause', 'Freeze Clause Mod'], + banlist: ['Uber', 'Sand Veil', 'King\'s Rock'], + }, + { + name: "[Gen 4] VGC 2009", + mod: 'gen4pt', + gameType: 'doubles', + bestOfDefault: true, + // searchShow: false, + ruleset: ['Flat Rules', '! Adjust Level Down', 'Max Level = 50'], + banlist: ['Tyranitar', 'Rotom', 'Judgment', 'Soul Dew'], + }, + + // Other Metagames + /////////////////////////////////////////////////////////////////// + + { + section: "Other Metagames", + column: 2, + }, + { + name: "[Gen 9] Almost Any Ability", + desc: `Pokémon have access to almost any ability.`, + mod: 'gen9', + ruleset: ['Standard OMs', '!Obtainable Abilities', 'Ability Clause = 1', 'Sleep Moves Clause', 'Terastal Clause'], + banlist: [ + 'Annihilape', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Ceruledge', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Dragonite', + 'Enamorus-Incarnate', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Iron Bundle', 'Iron Valiant', 'Keldeo', + 'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern', + 'Palkia', 'Palkia-Origin', 'Raging Bolt', 'Rayquaza', 'Regigigas', 'Reshiram', 'Shaymin-Sky', 'Slaking', 'Sneasler', 'Solgaleo', 'Spectrier', 'Urshifu', 'Urshifu-Rapid-Strike', + 'Volcarona', 'Walking Wake', 'Weavile', 'Zacian', 'Zacian-Crowned', 'Zekrom', 'Arena Trap', 'Comatose', 'Contrary', 'Fur Coat', 'Good as Gold', 'Gorilla Tactics', 'Huge Power', + 'Ice Scales', 'Illusion', 'Imposter', 'Innards Out', 'Magic Bounce', 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Orichalcum Pulse', 'Parental Bond', 'Poison Heal', 'Pure Power', + 'Shadow Tag', 'Simple', 'Speed Boost', 'Stakeout', 'Toxic Debris', 'Triage', 'Unburden', 'Water Bubble', 'Wonder Guard', 'King\'s Rock', 'Razor Fang', 'Baton Pass', + 'Last Respects', 'Shed Tail', + ], + }, + { + name: "[Gen 9] Balanced Hackmons", + desc: `Anything directly hackable onto a set (EVs, IVs, forme, ability, item, and move) and is usable in local battles is allowed.`, + mod: 'gen9', + ruleset: [ + 'OHKO Clause', 'Evasion Clause', 'Species Clause', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Moves Clause', + 'Endless Battle Clause', 'Hackmons Forme Legality', 'Species Reveal Clause', 'Terastal Clause', + ], + banlist: [ + 'Calyrex-Shadow', 'Deoxys-Attack', 'Gengar-Mega', 'Mewtwo-Mega-X', 'Mewtwo-Mega-Y', 'Rayquaza-Mega', 'Regigigas', 'Shedinja', 'Slaking', 'Arena Trap', + 'Contrary', 'Gorilla Tactics', 'Hadron Engine', 'Huge Power', 'Illusion', 'Innards Out', 'Libero', 'Liquid Ooze', 'Magnet Pull', 'Moody', 'Neutralizing Gas', + 'Orichalcum Pulse', 'Parental Bond', 'Poison Heal', 'Protean', 'Pure Power', 'Shadow Tag', 'Stakeout', 'Water Bubble', 'Wonder Guard', 'King\'s Rock', + 'Razor Fang', 'Baton Pass', 'Belly Drum', 'Ceaseless Edge', 'Clangorous Soul', 'Dire Claw', 'Electro Shot', 'Fillet Away', 'Imprison', 'Last Respects', + 'Lumina Crash', 'No Retreat', 'Photon Geyser', 'Power Trip', 'Quiver Dance', 'Rage Fist', 'Revival Blessing', 'Shed Tail', 'Sleep Talk', 'Substitute', + 'Shell Smash', 'Tail Glow', 'V-create', + ], + }, + { + name: "[Gen 9] Godly Gift", + desc: `Each Pokémon receives one base stat from a God (Restricted Pokémon) depending on its position in the team. If there is no restricted Pokémon, it uses the Pokémon in the first slot.`, + mod: 'gen9', + ruleset: ['Standard OMs', 'Evasion Abilities Clause', 'Evasion Items Clause', 'Sleep Moves Clause', 'Godly Gift Mod'], + banlist: [ + 'Blissey', 'Calyrex-Shadow', 'Chansey', 'Deoxys-Attack', 'Koraidon', 'Kyurem-Black', 'Miraidon', 'Arena Trap', 'Gale Wings', 'Huge Power', 'Moody', 'Pure Power', 'Shadow Tag', + 'Swift Swim', 'Focus Band', 'King\'s Rock', 'Quick Claw', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Shed Tail', + ], + restricted: [ + 'Alomomola', 'Annihilape', 'Araquanid', 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Chien-Pao', 'Chi-Yu', 'Crawdaunt', 'Deoxys-Normal', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Dragapult', + 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gliscor', 'Gouging Fire', 'Groudon', 'Hawlucha', 'Ho-Oh', 'Iron Bundle', 'Iron Hands', 'Kingambit', 'Kyogre', + 'Kyurem', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin', 'Raging Bolt', + 'Rayquaza', 'Regieleki', 'Reshiram', 'Serperior', 'Shaymin-Sky', 'Smeargle', 'Solgaleo', 'Spectrier', 'Terapagos', 'Toxapex', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Volcarona', 'Zacian', + 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', + ], + }, + { + name: "[Gen 9] Mix and Mega", + desc: `Mega evolve any Pokémon with any mega stone, or transform them with 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', + ruleset: ['Standard OMs', 'Evasion Items Clause', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Terastal Clause'], + banlist: [ + 'Calyrex-Shadow', 'Koraidon', 'Kyogre', 'Miraidon', 'Moody', 'Shadow Tag', 'Beedrillite', 'Blazikenite', 'Gengarite', + 'Kangaskhanite', 'Lucarionite Z', 'Malamarite', 'Mawilite', 'Medichamite', 'Pidgeotite', 'Red Orb', 'Starminite', + 'Baton Pass', 'Shed Tail', + ], + restricted: [ + 'Arceus', 'Basculegion-M', 'Calyrex-Ice', 'Ceruledge', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Eternatus', 'Flutter Mane', + 'Gengar', 'Gholdengo', 'Giratina', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Kyurem-Black', 'Kyurem-White', 'Lugia', + 'Lunala', 'Manaphy', 'Mewtwo', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza', 'Regigigas', 'Reshiram', + 'Slaking', 'Sneasler', 'Solgaleo', 'Ursaluna-Bloodmoon', 'Urshifu-Single-Strike', 'Walking Wake', 'Zacian', 'Zekrom', + ], + 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] Pokebilities AAA", + desc: `Pokémon have all of their released abilities simultaneously, as well as one ability they cannot normally use.`, + mod: 'pokebilities', + ruleset: ['Standard OMs', '!Obtainable Abilities', 'Ability Clause = 1', 'AAA Restricted Abilities', 'Terastal Clause', 'Sleep Moves Clause'], + banlist: [ + 'Annihilape', 'Arcanine-Hisui', 'Arceus', 'Archaludon', 'Azumarill', 'Basculegion', 'Basculin', 'Baxcalibur', 'Blaziken', 'Braviary-Hisui', 'Calyrex-Ice', 'Calyrex-Shadow', + 'Ceruledge', 'Chi-Yu', 'Chien-Pao', 'Clefable', 'Cloyster', 'Conkeldurr', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Dragonite', + 'Enamorus-Incarnate', 'Espathra', 'Eternatus', 'Excadrill', 'Flutter Mane', 'Gholdengo', 'Giratina', 'Giratina-Origin', 'Gliscor', 'Gouging Fire', 'Groudon', 'Hawlucha', + 'Ho-Oh', 'Hoopa-Unbound', 'Iron Bundle', 'Iron Valiant', 'Kingambit', 'Keldeo', 'Kleavor', 'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', + 'Lugia', 'Lunala', 'Magearna', 'Manaphy', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Noivern', 'Ogerpon-Hearthflame', 'Palkia', 'Palkia-Origin', + 'Porygon-Z', 'Raging Bolt', 'Rayquaza', 'Reshiram', 'Roaring Moon', 'Serperior', 'Shaymin-Sky', 'Smeargle', 'Sneasler', 'Solgaleo', 'Spectrier', 'Ursaluna', 'Ursaluna-Bloodmoon', + 'Urshifu-Single-Strike', 'Urshifu-Rapid-Strike', 'Volcarona', 'Walking Wake', 'Weavile', 'Yanmega', 'Zacian', 'Zacian-Crowned', 'Zekrom', 'Zoroark-Hisui', 'Arena Trap', + 'Magnet Pull', 'Moody', 'Neutralizing Gas', 'Shadow Tag', + 'Regenerator + Wimp Out', 'Regenerator + Emergency Exit', 'Regenerator > 2', 'Drizzle + Swift Swim', 'Primordial Sea + Swift Swim', 'Drought + Chlorophyll', + 'Desolate Land + Chlorophyll', 'Electric Surge + Surge Surfer', 'Hadron Engine + Surge Surfer', 'Hadron Engine + Quark Drive', 'Electric Surge + Quark Drive', + 'Drought + Protosynthesis', 'Sand Stream + Sand Rush', 'Sand Stream + Sand Veil', 'Snow Warning + Snow Cloak', 'Snow Warning + Slush Rush', + 'Bright Powder', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Revival Blessing', 'Shed Tail', 'Stored Power', + ], + restricted: [ + 'Comatose', 'Contrary', 'Fur Coat', 'Good as Gold', 'Gorilla Tactics', 'Huge Power', 'Ice Scales', 'Illusion', 'Imposter', 'Innards Out', 'Magic Bounce', 'Orichalcum Pulse', + 'Parental Bond', 'Poison Heal', 'Pure Power', 'Sand Veil', 'Simple', 'Snow Cloak', 'Speed Boost', 'Stakeout', 'Stench', 'Tinted Lens', 'Toxic Debris', 'Triage', 'Unburden', + 'Water Bubble', 'Wonder Guard', + ], + onValidateSet(set) { + const species = this.dex.species.get(set.species); + const unSeenAbilities = Object.keys(species.abilities) + .filter(key => key !== 'S' && (key !== 'H' || !species.unreleasedHidden)) + .map(key => species.abilities[key as "0" | "1" | "H" | "S"]) + .filter(ability => ability !== set.ability); + if (unSeenAbilities.length && this.toID(set.ability) !== this.toID(species.abilities['S'])) { + for (const abilityName of unSeenAbilities) { + const banReason = this.ruleTable.check('ability:' + this.toID(abilityName)); + if (banReason) { + return [`${set.name}'s ability ${abilityName} is ${banReason}.`]; + } + } + } + }, + onBegin() { + for (const pokemon of this.getAllPokemon()) { + if (pokemon.ability === this.toID(pokemon.species.abilities['S'])) { + continue; + } + pokemon.m.innates = Object.keys(pokemon.species.abilities) + .filter(key => key !== 'S' && (key !== 'H' || !pokemon.species.unreleasedHidden)) + .map(key => this.toID(pokemon.species.abilities[key as "0" | "1" | "H" | "S"])) + .filter(ability => ability !== pokemon.ability); + } + }, + onBeforeSwitchIn(pokemon) { + if (pokemon.m.innates) { + for (const innate of pokemon.m.innates) { + if (pokemon.hasAbility(innate)) continue; + const effect = 'ability:' + this.toID(innate); + pokemon.volatiles[effect] = this.initEffectState({ id: effect, target: pokemon }); + } + } + }, + onSwitchOut(pokemon) { + for (const innate of Object.keys(pokemon.volatiles).filter(i => i.startsWith('ability:'))) { + pokemon.removeVolatile(innate); + } + }, + onFaint(pokemon) { + for (const innate of Object.keys(pokemon.volatiles).filter(i => i.startsWith('ability:'))) { + const innateEffect = this.dex.conditions.get(innate) as Effect; + this.singleEvent('End', innateEffect, null, pokemon); + } + }, + onAfterMega(pokemon) { + for (const innate of Object.keys(pokemon.volatiles).filter(i => i.startsWith('ability:'))) { + pokemon.removeVolatile(innate); + } + pokemon.m.innates = undefined; + }, + }, + { + name: "[Gen 9] Shared Power", + desc: `Once a Pokémon switches in, its ability is shared with the rest of the team.`, + mod: 'sharedpower', + ruleset: ['Standard OMs', 'Evasion Abilities Clause', 'Evasion Items Clause', 'Sleep Moves Clause'], + banlist: [ + 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Conkeldurr', 'Deoxys-Attack', 'Eternatus', 'Greninja', 'Kingambit', 'Kyogre', 'Kyurem-Black', + 'Kyurem-White', 'Koraidon', 'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Rayquaza', + 'Regieleki', 'Reshiram', 'Rillaboom', 'Scizor', 'Shaymin-Sky', 'Spectrier', 'Sneasler', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', + 'Arena Trap', 'Moody', 'Neutralizing Gas', 'Shadow Tag', 'Speed Boost', 'Stench', 'Sturdy', 'Swift Swim', 'King\'s Rock', 'Leppa Berry', 'Razor Fang', 'Starf Berry', + 'Baton Pass', 'Extreme Speed', 'Last Respects', + ], + unbanlist: ['Arceus-Bug', 'Arceus-Dragon', 'Arceus-Fire', 'Arceus-Ice'], + restricted: [ + 'Armor Tail', 'Chlorophyll', 'Comatose', 'Contrary', 'Dazzling', 'Fur Coat', 'Gale Wings', 'Good as Gold', 'Huge Power', 'Ice Scales', 'Illusion', 'Imposter', + 'Magic Bounce', 'Magic Guard', 'Magnet Pull', 'Mold Breaker', 'Multiscale', 'Poison Heal', 'Prankster', 'Protosynthesis', 'Psychic Surge', 'Pure Power', + 'Quark Drive', 'Queenly Majesty', 'Quick Draw', 'Quick Feet', 'Regenerator', 'Sand Rush', 'Simple', 'Slush Rush', 'Stakeout', 'Stamina', 'Surge Surfer', + 'Technician', 'Tinted Lens', 'Triage', 'Unaware', 'Unburden', 'Water Bubble', + ], + onValidateRule() { + if (this.format.gameType !== 'singles') { + throw new Error(`Shared Power currently does not support ${this.format.gameType} battles.`); + } + }, + getSharedPower(pokemon) { + const sharedPower = new Set(); + for (const ally of pokemon.side.pokemon) { + if (pokemon.battle.ruleTable.isRestricted(`ability:${ally.baseAbility}`)) continue; + if (ally.previouslySwitchedIn > 0) { + if (pokemon.battle.dex.currentMod !== 'sharedpower' && ['trace', 'mirrorarmor'].includes(ally.baseAbility)) { + sharedPower.add('noability'); + continue; + } + sharedPower.add(ally.baseAbility); + } + } + sharedPower.delete(pokemon.baseAbility); + return sharedPower; + }, + onBeforeSwitchIn(pokemon) { + let format = this.format; + if (!format.getSharedPower) format = this.dex.formats.get('gen9sharedpower'); + for (const ability of format.getSharedPower!(pokemon)) { + const effect = 'ability:' + this.toID(ability); + pokemon.volatiles[effect] = this.initEffectState({ id: effect, target: pokemon }); + if (!pokemon.m.abils) pokemon.m.abils = []; + if (!pokemon.m.abils.includes(effect)) pokemon.m.abils.push(effect); + } + }, + }, + { + name: "[Gen 9] STABmons", + desc: `Pokémon can use any move of their typing, in addition to the moves they can normally learn.`, + mod: 'gen9', + ruleset: ['Standard OMs', 'STABmons Move Legality', 'Sleep Moves Clause', 'Terastal Clause'], + banlist: [ + 'Arceus', 'Azumarill', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dragapult', + 'Dragonite', 'Enamorus-Incarnate', 'Eternatus', 'Flutter Mane', 'Garchomp', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Gyarados', 'Ho-Oh', 'Iron Bundle', + 'Komala', 'Koraidon', 'Kyogre', 'Kyurem-Base', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Meloetta', 'Mewtwo', 'Miraidon', + 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Ogerpon-Wellspring', 'Palkia', 'Palkia-Origin', 'Porygon-Z', 'Raging Bolt', 'Rayquaza', 'Reshiram', + 'Roaring Moon', 'Shaymin-Sky', 'Solgaleo', 'Spectrier', 'Terapagos', 'Ting-Lu', 'Ursaluna', 'Ursaluna-Bloodmoon', 'Urshifu-Single-Strike', 'Urshifu-Rapid-Strike', + 'Walking Wake', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Zoroark-Hisui', 'Arena Trap', 'Moody', 'Shadow Tag', 'Damp Rock', 'King\'s Rock', 'Razor Fang', + 'Baton Pass', 'Last Respects', 'Shed Tail', + ], + restricted: [ + 'Astral Barrage', 'Belly Drum', 'Ceaseless Edge', 'Clangorous Soul', 'Combat Torque', 'Dire Claw', 'Dragon Energy', 'Electro Shot', 'Esper Wing', 'Extreme Speed', 'Fillet Away', + 'Final Gambit', 'Flower Trick', 'Gigaton Hammer', 'No Retreat', 'Rage Fist', 'Revival Blessing', 'Shell Smash', 'Shift Gear', 'Surging Strikes', 'Torch Song', 'Triple Arrows', + 'V-create', 'Victory Dance', 'Water Shuriken', 'Wicked Blow', 'Wicked Torque', + ], + }, + { + name: "[Gen 6] Pure Hackmons", + desc: `Anything that can be hacked in-game and is usable in local battles is allowed.`, + mod: 'gen6', + ruleset: ['-Nonexistent', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause', 'EV limit = 510'], + }, + + // Challengeable OMs + /////////////////////////////////////////////////////////////////// + + { + section: "Challengeable OMs", + column: 2, + }, + { + name: "[Gen 9] 1-2 Switch", + desc: `Doubles-based metagame where each Pokémon takes turns being "active" every few turns.`, + mod: 'gen9', + gameType: 'doubles', + searchShow: false, + ruleset: ['Standard OMs', 'Gravity Sleep Clause'], + banlist: [ + 'Annihilape', 'Arceus', 'Basculegion-M', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darkrai', 'Deoxys-Attack', 'Deoxys-Normal', 'Dialga', 'Dialga-Origin', 'Eternatus', 'Flutter Mane', + 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Lugia', 'Lunala', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', + 'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Tatsugiri', 'Terapagos', 'Urshifu', 'Urshifu-Rapid-Strike', 'Zacian', 'Zacian-Crowned', 'Zamazenta', + 'Zamazenta-Crowned', 'Moody', 'Shadow Tag', + ], + battle: { + endTurn() { + // @ts-expect-error Hack + for (const pokemon of this.getAllActive(false, true)) { + // turn counter hasn't been incremented yet + if (this.turn & 1 && pokemon.position === (this.turn & 2 ? 0 : 1) && pokemon.hp && pokemon.allies().length) { + pokemon.volatiles['commanding'] = this.initEffectState({ id: 'commanding', name: 'Commanding', target: pokemon }); + pokemon.volatiles['gastroacid'] = this.initEffectState({ id: 'gastroacid', name: 'Gastro Acid', target: pokemon }); + this.add('-message', `${pokemon.side.name}'s ${pokemon.name !== pokemon.species.name ? `${pokemon.name} (${pokemon.species.name})` : pokemon.name} will be skipped next turn.`); + } else { + pokemon.removeVolatile('commanding'); + pokemon.removeVolatile('gastroacid'); + } + } + this.constructor.prototype.endTurn.call(this); + }, + getAllActive(includeFainted, includeCommanding) { + const pokemonList: Pokemon[] = []; + for (const side of this.sides) { + for (const pokemon of side.active) { + if (pokemon && (includeFainted || !pokemon.fainted) && (includeCommanding || !pokemon.volatiles['commanding'])) { + pokemonList.push(pokemon); + } + } + } + return pokemonList; + }, + }, + side: { + allies(all?: boolean) { + let allies = this.active.filter(ally => ally); + if (!all) allies = allies.filter(ally => ally.hp && !ally.volatiles['commanding']); + return allies; + }, + }, + }, + { + name: "[Gen 9] 350 Cup", + desc: `Pokemon with a BST of 350 or lower have their stats doubled.`, + mod: 'gen9', + searchShow: false, + ruleset: ['Standard OMs', 'Sleep Moves Clause', '350 Cup Mod', 'Evasion Clause'], + banlist: ['Calyrex-Shadow', 'Clefairy', 'Flittle', 'Gastly', 'Miraidon', 'Pikachu', 'Rufflet', 'Smeargle', 'Arena Trap', 'Moody', 'Shadow Tag', 'Eviolite', 'Baton Pass'], + }, + { + name: "[Gen 9] Bad 'n Boosted", + desc: `All base stats of 70 and lower are doubled.`, + searchShow: false, + ruleset: ['Standard', 'Bad \'n Boosted Mod', 'Sleep Moves Clause', '!Sleep Clause Mod'], + banlist: ['AG', 'Araquanid', 'Cyclizar', 'Espathra', 'Espeon', 'Pawmot', 'Polteageist', 'Huge Power', 'Moody', 'Pure Power', 'Shadow Tag', 'Eviolite', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Last Respects'], + }, + { + name: "[Gen 9] Battlefields", + desc: `Any field condition with a set duration becomes permanent once triggered unless directly replaced, removed, or reversed. Namely, this impacts screens, weathers, terrains, room effects, gravity, and side conditions like Tailwind and Safeguard.`, + mod: 'gen9', + searchShow: false, + ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Evasion Abilities Clause'], + banlist: [ + 'Annihilape', 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Deoxys-Attack', 'Deoxys-Normal', 'Dialga', 'Dialga-Origin', 'Espathra', + 'Eternatus', 'Flutter Mane', 'Gholdengo', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', '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', 'Reshiram', 'Shaymin-Sky', 'Sneasler', 'Spectrier', 'Terapagos', 'Urshifu', 'Urshifu-Rapid-Strike', 'Zacian', + 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Aurora Veil', 'Baton Pass', 'Fairy Lock', + 'Last Respects', 'Light Screen', 'Quick Guard', 'Reflect', 'Shed Tail', 'Tailwind', 'Trick Room', + ], + onWeatherChange() { + this.field.weatherState.duration = 0; + }, + onTerrainChange() { + this.field.terrainState.duration = 0; + }, + onPseudoWeatherChange(target, source, pseudoWeather) { + this.field.pseudoWeather[pseudoWeather.id].duration = 0; + }, + onSideConditionStart(side, source, sideCondition) { + 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 ppUps = move.noPPBoosts ? 0 : 3; + const basePP = this.calculatePP(move, ppUps); + const newMove = { + move: move.name, + id: move.id, + pp: basePP, + maxpp: basePP, + target: move.target, + disabled: false, + used: false, + }; + pokemon.baseMoveSlots.push(newMove); + pokemon.ppUps.push(ppUps); + } + pokemon.moveSlots = pokemon.baseMoveSlots.slice(); + } + }, + }, + { + name: "[Gen 9] Camomons", + desc: `Pokémon have their types set to match their first two moves.`, + mod: 'gen9', + searchShow: false, + ruleset: ['Standard OMs', 'Sleep Clause Mod', 'Evasion Items Clause', 'Evasion Abilities Clause', 'Terastal Clause', 'Camomons Mod'], + banlist: [ + 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dragonite', 'Drednaw', + 'Enamorus-Incarnate', 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Kommo-o', 'Koraidon', 'Kyogre', + 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Manaphy', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', + 'Palafin', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Roaring Moon', 'Shaymin-Sky', 'Sneasler', 'Solgaleo', 'Spectrier', 'Tornadus-Therian', 'Ursaluna-Bloodmoon', + 'Volcarona', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'Booster Energy', 'King\'s Rock', 'Light Clay', 'Razor Fang', + 'Baton Pass', 'Last Respects', 'Shed Tail', + ], + }, + { + name: "[Gen 9] Category Swap", + desc: `All Special moves become Physical, and all Physical moves become Special.`, + mod: 'gen9', + searchShow: false, + ruleset: ['Standard OMs', 'Sleep Clause Mod', 'Category Swap Mod'], + banlist: [ + 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Dragapult', 'Eternatus', + 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Iron Valiant', 'Koraidon', 'Kyogre', 'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', + 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Regieleki', 'Reshiram', 'Roaring Moon', 'Solgaleo', + 'Spectrier', 'Terapagos', 'Volcarona', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'Damp Rock', 'King\'s Rock', + 'Razor Fang', 'Baton Pass', 'Draco Meteor', 'Last Respects', 'Overheat', 'Shed Tail', + ], + }, + { + name: "[Gen 9] Convergence", + desc: `Allows all Pokémon that have identical types to share moves and abilities.`, + mod: 'gen9', + searchShow: false, + ruleset: ['Standard OMs', 'Ability Clause = 1', 'Sleep Moves Clause', 'Convergence Legality', 'Terastal Clause', '!Obtainable Abilities'], + banlist: [ + 'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Comfey', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Deoxys-Speed', + 'Dialga', 'Dialga-Origin', 'Dondozo', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Haxorus', 'Ho-oh', 'Inteleon', + 'Iron Bundle', 'Iron Hands', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lilligant-Hisui', 'Lugia', 'Lunala', + 'Magearna', 'Manaphy', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin', + 'Porygon-Z', 'Primarina', 'Rayquaza', 'Regieleki', 'Regigigas', 'Reshiram', 'Roaring Moon', 'Shaymin-Sky', 'Solgaleo', 'Slaking', 'Smeargle', 'Sneasler', + 'Spectrier', 'Umbreon', 'Urshifu-Single-Strike', 'Urshifu-Rapid-Strike', 'Walking Wake', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', + 'Zekrom', 'Arena Trap', 'Comatose', 'Contrary', 'Drizzle', 'Drought', 'Imposter', 'Moody', 'Pure Power', 'Shadow Tag', 'Speed Boost', 'Unburden', + 'King\'s Rock', 'Light Clay', 'Razor Fang', 'Baton Pass', 'Belly Drum', 'Boomburst', 'Extreme Speed', 'Final Gambit', 'Last Respects', 'Population Bomb', + 'Quiver Dance', 'Rage Fist', 'Shed Tail', 'Shell Smash', 'Spore', 'Transform', + ], + }, { name: "[Gen 9] Fervent Impersonation", desc: `Nickname a Pokémon after another Pokémon that it shares a moveset with, and it will transform into the Pokémon it's nicknamed after once it drops to or below 50% health.`, @@ -1285,6 +1501,21 @@ export const Formats: import('../sim/dex-formats').FormatList = [ ], // Implemented the mechanics as a Rule because I'm too lazy to make battles read base format for `onResidual` at the moment }, + { + name: "[Gen 9] 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', + searchShow: false, + ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Evasion Abilities Clause', 'Evasion Items Clause', 'Flipped Mod'], + banlist: [ + 'Annihilape', 'Araquanid', 'Arceus', 'Azumarill', 'Blissey', 'Calyrex-Ice', 'Calyrex-Shadow', 'Cloyster', 'Cyclizar', 'Deoxys-Attack', 'Deoxys-Normal', + 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Espathra', '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-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'Damp Rock', 'King\'s Rock', 'Light Clay', 'Razor Fang', 'Baton Pass', + 'Last Respects', 'Shed Tail', + ], + }, { name: "[Gen 9] Foresighters", desc: `Moves in the first moveslot will be delayed by two turns.`, @@ -1397,7 +1628,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)) { @@ -1778,6 +2009,36 @@ export const Formats: import('../sim/dex-formats').FormatList = [ 'Baton Pass', 'Last Respects', 'Shed Tail', ], }, + { + name: "[Gen 9] Linked", + desc: `The first two moves in a Pokémon's moveset are used simultaneously.`, + mod: 'linked', + searchShow: false, + ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Evasion Clause', 'Terastal Clause'], + banlist: [ + 'Annihilape', 'Arceus', 'Archaludon', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Deoxys-Attack', 'Deoxys-Normal', 'Dialga', 'Dialga-Origin', + 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Jirachi', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', + 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Meloetta', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', + 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Roaring Moon', 'Shaymin-Sky', 'Sneasler', 'Solgaleo', 'Spectrier', 'Ursaluna-Bloodmoon', 'Urshifu-Single-Strike', + 'Urshifu-Rapid-Strike', 'Volcarona', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Chlorophyll', 'Drought', 'Electric Surge', 'Moody', + 'Sand Rush', 'Serene Grace', 'Shadow Tag', 'Slush Rush', 'Speed Boost', 'Swift Swim', 'Unburden', 'Booster Energy', 'King\'s Rock', 'Quick Claw', 'Razor Fang', + 'Baton Pass', 'Last Respects', 'Shed Tail', + ], + restricted: [ + 'Assurance', 'Baneful Bunker', 'Bounce', 'Burning Bulwark', 'Copycat', 'Detect', 'Dig', 'Dive', 'Encore', 'Endeavor', 'Fake Out', 'Fly', 'Imprison', 'Nasty Plot', + 'Phantom Force', 'Protect', 'Ruination', 'Shadow Force', 'Shell Smash', 'Silk Trap', 'Spiky Shield', 'Sunny Day', 'Super Fang', 'Swords Dance', 'Taunt', 'Trick Room', + ], + onValidateSet(set) { + const problems = []; + for (const [i, moveid] of set.moves.entries()) { + const move = this.dex.moves.get(moveid); + if ([0, 1].includes(i) && this.ruleTable.isRestricted(`move:${move.id}`)) { + problems.push(`${set.name || set.species}'s move ${move.name} cannot be linked.`); + } + } + return problems; + }, + }, { name: "[Gen 9] Nature Swap", desc: `Pokémon have their stats swapped around based on their nature. A Pokémon with a Modest nature will have its Atk and Sp. Atk stats swap.`, @@ -1830,9 +2091,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()) { @@ -2450,8 +2712,12 @@ export const Formats: import('../sim/dex-formats').FormatList = [ // Final modifier. Modifiers that modify damage after min damage check, such as Life Orb. baseDamage = this.battle.runEvent('ModifyDamage', pokemon, target, move, baseDamage); - if (move.isZOrMaxPowered && target.getMoveHitData(move).zBrokeProtect) { + const bypassProtect = target.getMoveHitData(move).bypassProtect; + if (bypassProtect) { baseDamage = this.battle.modify(baseDamage, 0.25); + if (bypassProtect !== true && bypassProtect.effectType === 'Ability') { + this.battle.add('-ability', pokemon, bypassProtect.name); + } this.battle.add('-zbroken', target); } @@ -2625,6 +2891,18 @@ export const Formats: import('../sim/dex-formats').FormatList = [ }, }, }, + { + 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 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", desc: `Sacrifice your Pokémon's ability for a status move that activates on switch-in.`, @@ -2748,11 +3026,11 @@ export const Formats: import('../sim/dex-formats').FormatList = [ ], }, { - name: "[Gen 6] Pure Hackmons", + name: "[Gen 7] Pure Hackmons", desc: `Anything that can be hacked in-game and is usable in local battles is allowed.`, - mod: 'gen6', + mod: 'gen7', searchShow: false, - ruleset: ['-Nonexistent', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause', 'EV limit = 510'], + ruleset: ['-Nonexistent', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause'], }, // Temporary Tour Metas @@ -2762,91 +3040,15 @@ 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', - searchShow: false, - gameType: 'doubles', - ruleset: ['Standard Doubles', 'Evasion Abilities Clause', 'Standard OMs', 'Sleep Moves Clause', '!Obtainable Abilities', 'Ability Clause = 2'], + name: "[Gen 5] Almost Any Ability", + mod: 'gen5', + ruleset: ['Standard', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Gems Clause', 'Baton Pass Stat Clause', '!Obtainable Abilities', 'Ability Clause = 2'], 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', + 'Uber', 'Archeops', 'Bisharp', 'Deoxys-Defense', 'Deoxys-Speed', 'Keldeo', 'Kyurem-Black', 'Mamoswine', 'Regigigas', 'Shedinja', 'Slaking', 'Snorlax', 'Suicune', 'Terrakion', + 'Volcarona', 'Arena Trap', 'Chlorophyll', 'Contrary', 'Huge Power', 'Illusion', 'Imposter', 'Pure Power', 'Sand Rush', 'Shadow Tag', 'Simple', 'Speed Boost', 'Swift Swim', + 'Tinted Lens', 'Wonder Guard', 'King\'s Rock', 'Razor Fang', 'Soul Dew', 'Assist', 'Swagger', ], - }, - { - name: "[Gen 9] AAA Ubers", - desc: `Pokémon have access to almost any ability.`, - mod: 'gen9', - searchShow: false, - ruleset: ['Standard OMs', 'Sleep Moves Clause', '!Obtainable Abilities', 'Terastal Clause'], - 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', - ], - }, - { - name: "[Gen 9] AAA UU", - desc: `Pokémon have access to almost any ability.`, - mod: 'gen9', - 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', - ], - }, - { - name: "[Gen 8] Almost Any Ability", - desc: `Pokémon have access to almost any ability.`, - mod: 'gen8', - 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', - ], - }, - { - 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'], + unbanlist: ['Landorus-Incarnate'], }, // National Dex @@ -2877,44 +3079,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [ { section: "National Dex Other Tiers", }, - { - name: "[Gen 9] National Dex 35 Pokes", - desc: `Only 35 Pokémon are legal.`, - mod: 'gen9', - searchShow: false, - ruleset: [ - 'Standard NatDex', - '!Species Clause', 'Forme Clause', 'Terastal Clause', 'DryPass Clause', 'Mega Rayquaza Clause', - ], - 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', - ], - 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', - ], - // 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`))) { - return [`Mega Evolution is banned.`]; - } - if (item.zMove && !(this.ruleTable.has(`+item:${item.id}`))) { - return [`${item.name} is banned.`]; - } - } - const species = this.dex.species.get(set.species); - if (set.moves.map(x => this.toID(this.dex.moves.get(x).realMove) || x).includes('hiddenpower') && - species.baseSpecies !== 'Unown' && !this.ruleTable.has(`+move:hiddenpower`)) { - return [`Hidden Power is banned.`]; - } - }, - }, { name: "[Gen 9] National Dex Ubers", mod: 'gen9', @@ -2934,6 +3098,20 @@ export const Formats: import('../sim/dex-formats').FormatList = [ ruleset: ['[Gen 9] National Dex UU'], banlist: ['ND UU', 'ND RUBL', 'Slowbronite'], }, + { + 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', 'Deoxys-Speed', 'Ditto', 'Dondozo', 'Eternatus', + 'Giratina-Origin', 'Groudon-Primal', 'Ho-Oh', 'Kyogre-Primal', 'Lunala', 'Marshadow', 'Mewtwo-Mega-Y', 'Necrozma-Dusk-Mane', 'Necrozma-Ultra', 'Pheromosa', + '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 LC", mod: 'gen9', @@ -2983,20 +3161,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', @@ -3040,7 +3204,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ searchShow: false, ruleset: [ 'Standard AG', 'NatDex Mod', '!Obtainable', - 'Forme Clause', 'Sleep Moves Clause', 'Ability Clause = 2', 'OHKO Clause', 'Evasion Moves Clause', 'Dynamax Clause', 'CFZ Clause', 'Terastal Clause', + 'Forme Clause', 'Sleep Moves Clause', 'Ability Clause = 2', 'OHKO Clause', 'Evasion Moves Clause', 'Dynamax Clause', 'CFZ Clause', 'Terastal Clause', '-Nonexistent', ], banlist: [ 'Cramorant-Gorging', 'Calyrex-Shadow', 'Darmanitan-Galar-Zen', 'Eternatus-Eternamax', 'Greninja-Ash', 'Groudon-Primal', 'Rayquaza-Mega', 'Shedinja', 'Terapagos-Stellar', 'Arena Trap', @@ -3126,7 +3290,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ { name: "[Gen 8] National Dex Doubles", mod: 'gen8', - // searchShow: false, + searchShow: false, gameType: 'doubles', ruleset: ['Standard Doubles', 'NatDex Mod', 'Evasion Abilities Clause'], banlist: [ @@ -3164,86 +3328,30 @@ 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] ReGeneration", // Roomtours + desc: `A Kanto-only Gen 9 metagame where many of the Pokemon have been redesigned with modern design philosophies.`, + mod: 'gen9regeneration', searchShow: false, - ruleset: ['Standard NatDex', 'Terastal Clause', 'Z-Move Clause', 'Super Type Moves Rule', 'Data Preview', 'Sprite Viewer'], + ruleset: ['Standard NatDex', 'Terastal Clause', 'Data Preview'], banlist: [ - 'All Pokemon', 'Crystal Heart', 'Wild Heart', - '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', + 'Arena Trap', 'Moody', 'Shadow Tag', 'Baton Pass', + 'Aerodactylite', 'Alakazite', 'Beedrillite', 'Blastoisinite', 'Charizardite X', 'Charizardite Y', 'Gyaradosite', + 'Gengarite', 'Kangaskhanite', 'Mewtwonite X', 'Mewtwonite Y', 'Pidgeotite', 'Pinsirite', 'Slowbronite', 'Venusaurite', ], 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(`raw|
Need help with all of the new moves and abilities?
Then make sure to check out the spreadsheet or use /dt!
`); + this.add('-message', `Welcome to ReGeneration!`); + this.add('-message', `This is a Generation 9 Pet Mod where many Kanto Pokemon have been redesigned to fit the modern era!`); 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/3718196/`); }, - 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]'); + onValidateSet(set, format) { + const species = this.dex.species.get(set.species || set.name); + if (species.num >= 152 && !this.ruleTable.has('+' + species.id)) { + return [`${species.baseSpecies} is not in the Kanto Pokédex.`]; } }, }, - { - 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 +3364,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 +3378,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.", @@ -3434,6 +3483,16 @@ export const Formats: import('../sim/dex-formats').FormatList = [ } }, }, + { + name: "[Gen 9] Live Patch Battles Ver 1.0.0", + threads: [`• https://twitter.com/pokemonpatches`], + mod: 'afd', + team: 'random', + ruleset: ['[Gen 9] Random Battle'], + onBegin() { + this.add(`raw|`); + }, + }, { name: "[Gen 9] Battle Factory", desc: `Randomized teams of Pokémon for a generated Smogon tier with sets that are competitively viable.`, @@ -3445,6 +3504,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 +3748,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 +3985,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 /////////////////////////////////////////////////////////////////// @@ -3975,19 +4007,19 @@ export const Formats: import('../sim/dex-formats').FormatList = [ { name: "[Gen 6] OU", mod: 'gen6', - ruleset: ['Standard', 'Evasion Abilities Clause', 'Swagger Clause'], - banlist: ['Uber', 'Arena Trap', 'Shadow Tag', 'King\'s Rock', 'Quick Claw', 'Razor Fang', 'Soul Dew', 'Baton Pass'], + ruleset: ['Standard', 'Evasion Abilities Clause'], + banlist: ['Uber', 'Arena Trap', 'Shadow Tag', 'King\'s Rock', 'Quick Claw', 'Razor Fang', 'Soul Dew', 'Baton Pass', 'Swagger'], }, { name: "[Gen 5] OU", mod: 'gen5', - ruleset: ['Standard', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Swagger Clause', 'Gems Clause', 'Baton Pass Stat Clause'], - banlist: ['Uber', 'Arena Trap', 'Drizzle ++ Swift Swim', 'Drought ++ Chlorophyll', 'Sand Rush', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Soul Dew', 'Assist'], + ruleset: ['Standard', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Gems Clause', 'Baton Pass Stat Clause'], + banlist: ['Uber', 'Arena Trap', 'Drizzle ++ Swift Swim', 'Drought ++ Chlorophyll', 'Sand Rush', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Soul Dew', 'Assist', 'Swagger'], }, { 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'], }, { @@ -4020,30 +4052,30 @@ export const Formats: import('../sim/dex-formats').FormatList = [ name: "[Gen 8] Doubles OU", mod: 'gen8', gameType: 'doubles', - ruleset: ['Standard Doubles', 'Dynamax Clause', 'Swagger Clause'], - banlist: ['DUber', 'Power Construct', 'Shadow Tag'], + ruleset: ['Standard Doubles', 'Dynamax Clause'], + banlist: ['DUber', 'Power Construct', 'Shadow Tag', 'Swagger'], }, { name: "[Gen 7] Doubles OU", mod: 'gen7', gameType: 'doubles', - ruleset: ['Standard Doubles', 'Swagger Clause'], - banlist: ['DUber', 'Power Construct', 'Eevium Z', 'Dark Void'], + ruleset: ['Standard Doubles'], + banlist: ['DUber', 'Power Construct', 'Eevium Z', 'Dark Void', 'Swagger'], }, { name: "[Gen 6] Doubles OU", mod: 'gen6', gameType: 'doubles', - ruleset: ['Standard Doubles', 'Swagger Clause'], - banlist: ['DUber', 'Soul Dew', 'Dark Void'], + ruleset: ['Standard Doubles'], + banlist: ['DUber', 'Soul Dew', 'Dark Void', 'Swagger'], }, { name: "[Gen 5] Doubles OU", mod: 'gen5', gameType: 'doubles', searchShow: false, - ruleset: ['Standard', 'Evasion Abilities Clause', 'Swagger Clause', 'Sleep Clause Mod'], - banlist: ['DUber', 'Shadow Tag', 'Soul Dew', 'Dark Void', 'Gravity'], + ruleset: ['Standard', 'Evasion Abilities Clause', 'Sleep Clause Mod'], + banlist: ['DUber', 'Shadow Tag', 'Soul Dew', 'Dark Void', 'Gravity', 'Swagger'], }, { name: "[Gen 4] Doubles OU", @@ -4151,7 +4183,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ name: "[Gen 8] Anything Goes", mod: 'gen8', searchShow: false, - ruleset: ['Obtainable', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause'], + ruleset: ['Standard AG'], }, { name: "[Gen 8] ZU", @@ -4321,11 +4353,11 @@ export const Formats: import('../sim/dex-formats').FormatList = [ name: "[Gen 7] LC", mod: 'gen7', searchShow: false, - ruleset: ['Little Cup', 'Standard', 'Swagger Clause'], + ruleset: ['Little Cup', 'Standard'], banlist: [ 'Aipom', 'Cutiefly', 'Drifloon', 'Gligar', 'Gothita', 'Meditite', 'Misdreavus', 'Murkrow', 'Porygon', 'Scyther', 'Sneasel', 'Swirlix', 'Tangela', 'Trapinch', 'Vulpix-Base', 'Vulpix-Alola', 'Wingull', 'Yanma', - 'Eevium Z', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Sticky Web', + 'Eevium Z', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Sticky Web', 'Swagger', ], }, { @@ -4333,13 +4365,14 @@ export const Formats: import('../sim/dex-formats').FormatList = [ desc: `All the Pokémon on a team must share a type.`, mod: 'gen7', searchShow: false, - ruleset: ['Same Type Clause', 'Standard', 'Evasion Abilities Clause', 'Swagger Clause'], + ruleset: ['Same Type Clause', 'Standard', 'Evasion Abilities Clause'], banlist: [ 'Aegislash', 'Arceus', 'Blaziken', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Genesect', 'Gengar-Mega', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Kangaskhan-Mega', 'Kartana', 'Kyogre', 'Kyurem-White', 'Lucario-Mega', 'Lugia', 'Lunala', 'Magearna', 'Marshadow', 'Mawile-Mega', 'Medicham-Mega', 'Metagross-Mega', 'Mewtwo', 'Naganadel', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Pheromosa', 'Rayquaza', 'Reshiram', 'Salamence-Mega', 'Shaymin-Sky', 'Solgaleo', 'Tapu Lele', 'Xerneas', 'Yveltal', 'Zekrom', 'Zygarde', 'Battle Bond', 'Shadow Tag', 'Damp Rock', 'Focus Band', 'King\'s Rock', 'Quick Claw', 'Razor Fang', 'Smooth Rock', 'Terrain Extender', 'Baton Pass', + 'Swagger', ], }, { @@ -4349,21 +4382,21 @@ export const Formats: import('../sim/dex-formats').FormatList = [ searchShow: false, ruleset: [ 'Picked Team Size = 1', 'Max Team Size = 3', - 'Obtainable', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Swagger Clause', 'Evasion Moves Clause', 'Accuracy Moves Clause', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause', + 'Obtainable', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Accuracy Moves Clause', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause', ], banlist: [ 'Arceus', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Deoxys-Defense', 'Dialga', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kangaskhan-Mega', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Marshadow', 'Mew', 'Mewtwo', 'Mimikyu', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palkia', 'Rayquaza', 'Reshiram', 'Salamence-Mega', 'Shaymin-Sky', 'Snorlax', 'Solgaleo', 'Tapu Koko', 'Xerneas', 'Yveltal', 'Zekrom', 'Moody', 'Focus Sash', 'Grass Whistle', 'Hypnosis', - 'Perish Song', 'Sing', 'Detect + Fightinium Z', + 'Perish Song', 'Sing', 'Swagger', 'Detect + Fightinium Z', ], }, { name: "[Gen 7] Anything Goes", mod: 'gen7', searchShow: false, - ruleset: ['Obtainable', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause'], + ruleset: ['Standard AG'], }, { name: "[Gen 7] ZU", @@ -4439,6 +4472,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', @@ -4478,14 +4523,15 @@ export const Formats: import('../sim/dex-formats').FormatList = [ name: "[Gen 6] Ubers", mod: 'gen6', searchShow: false, - ruleset: ['Standard', 'Swagger Clause', 'Mega Rayquaza Clause'], + ruleset: ['Standard', 'Mega Rayquaza Clause'], + banlist: ['Swagger'], }, { name: "[Gen 6] UU", mod: 'gen6', searchShow: false, - ruleset: ['Standard', 'Swagger Clause'], - banlist: ['Uber', 'OU', 'UUBL', 'Arena Trap', 'Drizzle', 'Drought', 'Shadow Tag', 'Soul Dew', 'Baton Pass'], + ruleset: ['Standard'], + banlist: ['Uber', 'OU', 'UUBL', 'Arena Trap', 'Drizzle', 'Drought', 'Shadow Tag', 'Soul Dew', 'Baton Pass', 'Swagger'], }, { name: "[Gen 6] RU", @@ -4512,7 +4558,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ name: "[Gen 6] LC", mod: 'gen6', searchShow: false, - ruleset: ['Standard', 'Little Cup'], + ruleset: ['Standard', 'Little Cup', 'Pomeg Glitch Clause'], banlist: [ 'Drifloon', 'Gligar', 'Meditite', 'Misdreavus', 'Murkrow', 'Scyther', 'Sneasel', 'Swirlix', 'Tangela', 'Yanma', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Swagger', @@ -4523,13 +4569,13 @@ export const Formats: import('../sim/dex-formats').FormatList = [ desc: `All the Pokémon on a team must share a type.`, mod: 'gen6', searchShow: false, - ruleset: ['Standard', 'Swagger Clause', 'Evasion Abilities Clause', 'Same Type Clause'], + ruleset: ['Standard', 'Evasion Abilities Clause', 'Same Type Clause'], banlist: [ 'Aegislash', 'Altaria-Mega', 'Arceus', 'Blaziken', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Deoxys-Speed', 'Dialga', 'Genesect', 'Gengar-Mega', 'Giratina', 'Giratina-Origin', 'Greninja', 'Groudon', 'Ho-Oh', 'Hoopa-Unbound', 'Kangaskhan-Mega', 'Keldeo', 'Kyogre', 'Kyurem-White', 'Lucario-Mega', 'Lugia', 'Mawile-Mega', 'Medicham-Mega', 'Metagross-Mega', 'Mewtwo', 'Palkia', 'Rayquaza', 'Reshiram', 'Sableye-Mega', 'Salamence-Mega', 'Shaymin-Sky', 'Slowbro-Mega', 'Talonflame', 'Xerneas', 'Yveltal', 'Zekrom', 'Shadow Tag', 'Damp Rock', 'Focus Band', 'King\'s Rock', 'Quick Claw', 'Razor Fang', - 'Smooth Rock', 'Soul Dew', 'Baton Pass', + 'Smooth Rock', 'Soul Dew', 'Baton Pass', 'Swagger', ], }, { @@ -4538,21 +4584,22 @@ export const Formats: import('../sim/dex-formats').FormatList = [ mod: 'gen6', searchShow: false, ruleset: [ - 'Max Team Size = 3', 'Picked Team Size = 1', 'Obtainable', 'Nickname Clause', 'Moody Clause', 'OHKO Clause', - 'Evasion Moves Clause', 'Accuracy Moves Clause', 'Swagger Clause', 'Endless Battle Clause', 'HP Percentage Mod', + 'Max Team Size = 3', 'Picked Team Size = 1', 'Obtainable', 'Nickname Clause', 'OHKO Clause', + 'Evasion Moves Clause', 'Accuracy Moves Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod', 'Team Preview', ], banlist: [ 'Arceus', 'Charizard-Mega-X', 'Charizard-Mega-Y', 'Deoxys-Normal', 'Deoxys-Attack', 'Deoxys-Defense', 'Dialga', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Kangaskhan-Mega', 'Kyogre', 'Kyurem-White', 'Lugia', 'Mew', 'Mewtwo', 'Palkia', 'Rayquaza', 'Reshiram', 'Salamence-Mega', 'Shaymin-Sky', - 'Snorlax', 'Xerneas', 'Yveltal', 'Zekrom', 'Focus Sash', 'Soul Dew', 'Dark Void', 'Grass Whistle', 'Hypnosis', 'Perish Song', 'Sing', 'Sleep Powder', 'Yawn', + 'Snorlax', 'Xerneas', 'Yveltal', 'Zekrom', 'Moody', 'Focus Sash', 'Soul Dew', 'Dark Void', 'Grass Whistle', 'Hypnosis', 'Perish Song', 'Sing', 'Sleep Powder', + 'Swagger', 'Yawn', ], }, { name: "[Gen 6] Anything Goes", mod: 'gen6', searchShow: false, - ruleset: ['Obtainable', 'Team Preview', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'], + ruleset: ['Standard AG'], }, { name: "[Gen 6] ZU", @@ -4665,18 +4712,12 @@ export const Formats: import('../sim/dex-formats').FormatList = [ section: "B2/W2 Singles", column: 4, }, - { - name: "[Gen 5] Ubers", - mod: 'gen5', - searchShow: false, - ruleset: ['Standard', 'Sleep Clause Mod'], - }, { name: "[Gen 5] UU", mod: 'gen5', searchShow: false, - ruleset: ['Standard', 'Evasion Abilities Clause', 'Swagger Clause', 'Sleep Clause Mod'], - banlist: ['Uber', 'OU', 'UUBL', 'Arena Trap', 'Drought', 'Sand Stream', 'Snow Warning', 'Prankster + Assist', 'Prankster + Copycat', 'Baton Pass'], + ruleset: ['Standard', 'Evasion Abilities Clause', 'Sleep Clause Mod'], + banlist: ['Uber', 'OU', 'UUBL', 'Arena Trap', 'Drought', 'Sand Stream', 'Snow Warning', 'Prankster + Assist', 'Prankster + Copycat', 'Baton Pass', 'Swagger'], }, { name: "[Gen 5] RU", @@ -4709,6 +4750,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', 'Pomeg Glitch Clause', '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.`, @@ -4716,13 +4767,13 @@ export const Formats: import('../sim/dex-formats').FormatList = [ searchShow: false, ruleset: [ 'Picked Team Size = 1', 'Max Team Size = 3', - 'Standard', 'Baton Pass Clause', 'Swagger Clause', 'Accuracy Moves Clause', 'Sleep Moves Clause', + 'Standard', 'Baton Pass Clause', 'Accuracy Moves Clause', 'Sleep Moves Clause', ], banlist: [ 'Arceus', 'Blaziken', 'Cottonee', 'Darkrai', 'Deoxys', 'Dialga', 'Dragonite', 'Giratina', 'Groudon', 'Ho-Oh', 'Jirachi', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Mew', 'Mewtwo', 'Palkia', 'Rayquaza', 'Reshiram', 'Shaymin-Sky', 'Thundurus-Incarnate', 'Togekiss', 'Victini', 'Whimsicott', 'Zekrom', 'Focus Band', 'Focus Sash', - 'Quick Claw', 'Soul Dew', 'Perish Song', + 'Quick Claw', 'Soul Dew', 'Perish Song', 'Swagger', ], }, { @@ -4755,8 +4806,8 @@ export const Formats: import('../sim/dex-formats').FormatList = [ name: "[Gen 5] BW1 OU", mod: 'gen5bw1', searchShow: false, - ruleset: ['Standard', 'Sleep Clause Mod', 'Swagger Clause', 'Baton Pass Stat Clause'], - banlist: ['Uber', 'Drizzle ++ Swift Swim', 'King\'s Rock', 'Razor Fang', 'Soul Dew'], + ruleset: ['Standard', 'Sleep Clause Mod', 'Baton Pass Stat Clause'], + banlist: ['Uber', 'Drizzle ++ Swift Swim', 'King\'s Rock', 'Razor Fang', 'Soul Dew', 'Swagger'], }, { name: "[Gen 5] GBU Singles", @@ -4857,7 +4908,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ name: "[Gen 4] NU", mod: 'gen4', searchShow: false, - ruleset: ['[Gen 4] UU', 'Baton Pass Clause'], + ruleset: ['[Gen 4] UU', 'Baton Pass Clause', '!Sleep Moves Clause', 'Sleep Clause Mod'], banlist: ['UU', 'NUBL'], unbanlist: ['Sand Veil', 'Baton Pass'], }, @@ -4865,7 +4916,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ name: "[Gen 4] LC", mod: 'gen4', searchShow: false, - ruleset: ['Standard', 'Little Cup', 'Evasion Abilities Clause', 'Sleep Moves Clause'], + ruleset: ['Standard', 'Little Cup', 'Pomeg Glitch Clause', 'Evasion Abilities Clause', 'Sleep Moves Clause'], banlist: [ 'Meditite', 'Misdreavus', 'Murkrow', 'Scyther', 'Sneasel', 'Tangela', 'Yanma', 'Berry Juice', 'Deep Sea Tooth', 'Dragon Rage', 'Sonic Boom', 'Swagger', @@ -4875,7 +4926,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: ['Standard AG'], }, { name: "[Gen 4] 1v1", @@ -4990,15 +5041,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [ } }, }, - { - name: "[Gen 4] VGC 2009", - mod: 'gen4pt', - gameType: 'doubles', - searchShow: false, - bestOfDefault: true, - ruleset: ['Flat Rules', '! Adjust Level Down', 'Max Level = 50'], - banlist: ['Tyranitar', 'Rotom', 'Judgment', 'Soul Dew'], - }, { name: "[Gen 4] Doubles Custom Game", mod: 'gen4', @@ -5021,16 +5063,9 @@ export const Formats: import('../sim/dex-formats').FormatList = [ name: "[Gen 3] Ubers", mod: 'gen3', searchShow: false, - ruleset: ['Standard', 'Deoxys Camouflage Clause', 'One Baton Pass Clause'], + ruleset: ['Standard', 'Deoxys Camouflage Clause Mod', 'One Baton Pass Clause'], banlist: ['Wobbuffet + Leftovers', 'Wynaut + Leftovers', 'Baton Pass'], }, - { - name: "[Gen 3] RU", - mod: 'gen3', - searchShow: false, - ruleset: ['Standard'], - banlist: ['Uber', 'OU', 'UUBL', 'UU', 'RUBL', 'Glalie', 'Smeargle + Ingrain', 'Arena Trap', 'Baton Pass', 'Swagger'], - }, { name: "[Gen 3] UU", mod: 'gen3', @@ -5038,6 +5073,13 @@ export const Formats: import('../sim/dex-formats').FormatList = [ ruleset: ['Standard'], banlist: ['Uber', 'OU', 'UUBL', 'Smeargle + Ingrain', 'Arena Trap', 'Baton Pass', 'Swagger'], }, + { + name: "[Gen 3] RU", + mod: 'gen3', + searchShow: false, + ruleset: ['Standard'], + banlist: ['Uber', 'OU', 'UUBL', 'UU', 'RUBL', 'Glalie', 'Smeargle + Ingrain', 'Arena Trap', 'Baton Pass', 'Swagger'], + }, { name: "[Gen 3] NU", mod: 'gen3', @@ -5056,7 +5098,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ name: "[Gen 3] LC", mod: 'gen3', searchShow: false, - ruleset: ['Standard', 'Little Cup', 'Sleep Moves Clause', 'Accuracy Moves Clause'], + ruleset: ['Standard', 'Little Cup', 'Pomeg Glitch Clause', 'Sleep Moves Clause', 'Accuracy Moves Clause'], banlist: ['Chansey', 'Diglett', 'Meditite', 'Omanyte', 'Porygon', 'Scyther', 'Wynaut', 'Zigzagoon', 'Deep Sea Tooth', 'Baton Pass', 'Dragon Rage', 'Sonic Boom', 'Swagger', 'Thunder Wave'], }, { @@ -5089,8 +5131,8 @@ export const Formats: import('../sim/dex-formats').FormatList = [ name: "[Gen 3] ZU", mod: 'gen3', searchShow: false, - ruleset: ['Standard', 'Sleep Moves Clause', 'Baton Pass Stat Trap Clause', 'Swagger Clause'], - banlist: ['Uber', 'OU', 'UUBL', 'UU', 'RUBL', 'RU', 'NUBL', 'NU', 'PUBL', 'PU', 'ZUBL', 'Baton Pass + Substitute'], + ruleset: ['Standard', 'Sleep Moves Clause', 'Baton Pass Stat Trap Clause'], + banlist: ['Uber', 'OU', 'UUBL', 'UU', 'RUBL', 'RU', 'NUBL', 'NU', 'PUBL', 'PU', 'ZUBL', 'Swagger', 'Baton Pass + Substitute'], }, { name: "[Gen 3] ADV 200", @@ -5106,7 +5148,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", @@ -5115,15 +5156,36 @@ export const Formats: import('../sim/dex-formats').FormatList = [ gameType: 'doubles', ruleset: [ 'Obtainable', 'Team Preview', 'Species Clause', 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Max Team Size = 6', 'VGC Timer', - 'Nickname Clause', 'Endless Battle Clause', 'Cancel Mod', 'Picked Team Size = 4', 'Exact HP Mod', 'Item Clause = 1', 'Open Team Sheets', + 'Nickname Clause', 'Beat Up Nicknames Mod', 'Endless Battle Clause', 'Cancel Mod', 'Picked Team Size = 4', 'Exact HP Mod', 'Item Clause = 1', 'Open Team Sheets', ], - banlist: ['Soul Dew', 'Deoxys-Defense', 'Deoxys-Attack', 'Deoxys-Speed', 'Restricted Legendary', 'Mythical'], - unbanlist: ['Latios', 'Latias', 'Wobbuffet', 'Wynaut'], + banlist: ['Restricted Legendary', 'Mythical', 'Soul Dew'], bestOfDefault: true, onBegin() { this.add('rule', 'Self-KO Clause: If your last Pok\u00e9mon faints to a self-KO move or effect, you will lose the battle'); }, }, + { + name: "[Gen 3] Hoenn Stadium", + threads: [ + `• ADV Sample Teams`, + `• Orre Colosseum`, + `• Join the discord server`, + ], + + mod: 'gen3colosseum', + searchShow: false, + gameType: 'singles', + ruleset: [ + 'Obtainable', 'Team Preview', 'Species Clause', 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Max Team Size = 6', 'VGC Timer', + 'Nickname Clause', 'Beat Up Nicknames Mod', 'Endless Battle Clause', 'Cancel Mod', 'Picked Team Size = 3', 'Exact HP Mod', "Item Clause = 1", 'Open Team Sheets', + ], + banlist: ['Soul Dew', 'Restricted Legendary', 'Mythical', 'Wobbuffet + Leftovers', 'Wynaut + Leftovers'], + restricted: [], + bestOfDefault: true, + onBegin() { + this.add('rule', 'Self-KO Clause: If your last Pok\u00e9mon faints to a self-KO move or effect you will lose the battle'); + }, + }, { name: "[Gen 3] Custom Game", mod: 'gen3', @@ -5140,6 +5202,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 +5229,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'], }, { @@ -5184,7 +5252,8 @@ export const Formats: import('../sim/dex-formats').FormatList = [ mod: 'gen2', searchShow: false, ruleset: ['[Gen 2] PU'], - banlist: ['PU', 'ZUBL'], + banlist: ['PU', 'ZUBL', 'Baton Pass + Mean Look', 'Baton Pass + Spider Web'], + unbanlist: ['Baton Pass'], }, { name: "[Gen 2] NC 2000", @@ -5193,7 +5262,9 @@ export const Formats: import('../sim/dex-formats').FormatList = [ searchShow: false, ruleset: [ 'Picked Team Size = 3', 'Min Level = 50', 'Max Level = 55', 'Max Total Level = 155', - 'Obtainable', 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Species Clause', 'Item Clause = 1', 'Endless Battle Clause', 'Cancel Mod', 'Event Moves Clause', 'Nickname Clause', 'Team Preview', + 'Obtainable', 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Species Clause', 'Item Clause = 1', + 'Endless Battle Clause', 'Cancel Mod', 'Event Moves Clause', 'Nickname Clause', 'Beat Up Nicknames Mod', + 'Team Preview', ], banlist: ['Uber'], }, @@ -5250,7 +5321,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [ name: "[Gen 1] LC", mod: 'gen1', searchShow: false, - ruleset: ['Little Cup', 'Standard', '!Max Level', 'Adjust Level = 5'], + ruleset: ['Little Cup', 'Standard', '!Max Level', 'Adjust Level = 5', 'Sleep Moves Clause', 'Accuracy Moves Clause'], banlist: ['Dragon Rage', 'Fire Spin', 'Sonic Boom', 'Wrap'], }, { @@ -5263,6 +5334,17 @@ export const Formats: import('../sim/dex-formats').FormatList = [ ], banlist: ['Mew', 'Mewtwo', 'Bind', 'Clamp', 'Explosion', 'Fire Spin', 'Self-Destruct', 'Wrap'], }, + { + 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] Japanese OU", desc: `Generation 1 with Japanese battle mechanics.`, @@ -5281,6 +5363,14 @@ export const Formats: import('../sim/dex-formats').FormatList = [ 'Exeggutor + Stun Spore + Stomp', 'Jolteon + Focus Energy + Thunder Shock', 'Flareon + Focus Energy + Ember', ], }, + { + name: "[Gen 1] Stadium Rentals", + desc: `Only Pokémon sets that can be rented through the American Stadium Poké Cup are legal.`, + mod: 'gen1stadium', + searchShow: false, + ruleset: ['Stadium Sleep Clause', 'Freeze Clause Mod', 'Species Clause', 'Nickname Clause', 'Team Preview', 'Stadium Poke Cup Rentals'], + banlist: ['Uber'], + }, { name: "[Gen 1] Tradebacks OU", desc: `RBY OU with movepool additions from the Time Capsule.`, @@ -5288,17 +5378,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 de53fa71ce..e1225a69dc 100644 --- a/data/abilities.ts +++ b/data/abilities.ts @@ -1003,6 +1003,28 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = { rating: 3.5, num: 88, }, + dragonize: { + isNonstandard: "Future", + onModifyTypePriority: -1, + onModifyType(move, pokemon) { + const noModifyType = [ + 'judgment', 'multiattack', 'naturalgift', 'revelationdance', 'technoblast', 'terrainpulse', 'weatherball', + ]; + if (move.type === 'Normal' && (!noModifyType.includes(move.id) || this.activeMove?.isMax) && + !(move.isZ && move.category !== 'Status') && !(move.name === 'Tera Blast' && pokemon.terastallized)) { + move.type = 'Dragon'; + move.typeChangerBoosted = this.effect; + } + }, + onBasePowerPriority: 23, + onBasePower(basePower, pokemon, target, move) { + if (move.typeChangerBoosted === this.effect) return this.chainModify([4915, 4096]); + }, + flags: {}, + name: "Dragonize", + rating: 4, + num: 312, + }, dragonsmaw: { onModifyAtkPriority: 5, onModifyAtk(atk, attacker, defender, move) { @@ -1059,7 +1081,7 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = { } }, onWeather(target, source, effect) { - if (target.hasItem('utilityumbrella')) return; + if (target.effectiveWeather() !== effect.id) return; if (effect.id === 'raindance' || effect.id === 'primordialsea') { this.heal(target.baseMaxhp / 8); } else if (effect.id === 'sunnyday' || effect.id === 'desolateland') { @@ -1094,14 +1116,14 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = { }, effectspore: { onDamagingHit(damage, target, source, move) { - if (this.checkMoveMakesContact(move, source, target) && !source.status && source.runStatusImmunity('powder')) { + if (this.checkMoveMakesContact(move, source, target) && source.runStatusImmunity('powder')) { const r = this.random(100); if (r < 11) { - source.setStatus('slp', target); + source.trySetStatus('slp', target); } else if (r < 21) { - source.setStatus('par', target); + source.trySetStatus('par', target); } else if (r < 30) { - source.setStatus('psn', target); + source.trySetStatus('psn', target); } } }, @@ -1987,7 +2009,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(); @@ -2303,10 +2325,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: {}, @@ -2474,6 +2493,20 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = { rating: 3, num: 178, }, + megasol: { + isNonstandard: "Future", + onWeatherModifyDamage(damage, attacker, defender, move) { + if (this.field.weather !== 'sunnyday') { + (this.dex.conditions.getByID('sunnyday' as ID) as any).onWeatherModifyDamage + .call(this, damage, attacker, defender, move); + } + }, + flags: {}, + name: "Mega Sol", + rating: 3, + num: 315, + // Partially implemented in Pokemon.effectiveWeather() in sim/pokemon.ts + }, merciless: { onModifyCritRatio(critRatio, source, target) { if (target && ['psn', 'tox'].includes(target.status)) return 5; @@ -2688,10 +2721,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: {}, @@ -3187,6 +3217,20 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = { rating: 0.5, num: 53, }, + piercingdrill: { + isNonstandard: "Future", + onHitProtect(source, target, move) { + if (move.flags['contact']) { + target.getMoveHitData(move).bypassProtect = this.effect; + return false; + } + }, + // breaking protect handled in Battle#checkMoveBypassesProtect() + flags: {}, + name: "Piercing Drill", + rating: 1, + num: 311, + }, pixilate: { onModifyTypePriority: -1, onModifyType(move, pokemon) { @@ -3652,7 +3696,7 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = { }, raindish: { onWeather(target, source, effect) { - if (target.hasItem('utilityumbrella')) return; + if (target.effectiveWeather() !== effect.id) return; if (effect.id === 'raindance' || effect.id === 'primordialsea') { this.heal(target.baseMaxhp / 16); } @@ -4095,7 +4139,7 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = { }, sheerforce: { onModifyMove(move, pokemon) { - if (move.secondaries) { + if (move.secondaries && !move.hasSheerForceBoost) { delete move.secondaries; // Technically not a secondary effect, but it is negated delete move.self; @@ -4106,7 +4150,7 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = { }, onBasePowerPriority: 21, onBasePower(basePower, pokemon, target, move) { - if (move.hasSheerForce) return this.chainModify([5325, 4096]); + if (move.hasSheerForce || move.hasSheerForceBoost) return this.chainModify([5325, 4096]); }, flags: {}, name: "Sheer Force", @@ -4229,6 +4273,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, @@ -4291,7 +4339,7 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = { } }, onWeather(target, source, effect) { - if (target.hasItem('utilityumbrella')) return; + if (target.effectiveWeather() !== effect.id) return; if (effect.id === 'sunnyday' || effect.id === 'desolateland') { this.damage(target.baseMaxhp / 8, target, target); } @@ -4353,6 +4401,16 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = { rating: 4.5, num: 3, }, + spicyspray: { + isNonstandard: "Future", + onDamagingHit(damage, target, source, move) { + source.trySetStatus('brn', target); + }, + flags: {}, + name: "Spicy Spray", + rating: 3, + num: 318, + }, stakeout: { onModifyAtkPriority: 5, onModifyAtk(atk, attacker, defender) { @@ -5240,20 +5298,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..8f8d290bee 100644 --- a/data/aliases.ts +++ b/data/aliases.ts @@ -15,9 +15,11 @@ export const Aliases: import('../sim/dex').AliasesTable = { zeroused: "[Gen 9] ZU", mono: "[Gen 9] Monotype", ag: "[Gen 9] Anything Goes", - bss: "[Gen 9] BSS Reg J", - vgc: "[Gen 9] VGC 2026 Reg F", - bsd: "[Gen 9] VGC 2026 Reg F", + champsou: "[Gen 9 Champions] OU", + cou: "[Gen 9 Champions] OU", + bss: "[Gen 9 Champions] BSS Reg M-A", + vgc: "[Gen 9 Champions] VGC 2026 Reg M-A", + bsd: "[Gen 9 Champions] VGC 2026 Reg M-A", randdubs: "[Gen 9] Random Doubles Battle", doubles: "[Gen 9] Doubles OU", dou: "[Gen 9] Doubles OU", @@ -91,8 +93,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] Alphabet Cup", + lcotm: "[Gen 9] Cross Evolution", + ommotm: "[Gen 9] STAAABmons", + ommspotlight: "[Gen 9] STAAABmons", // mega evos --- 1st ordered alphabetically by species, 2nd by alias megasnow: "Abomasnow-Mega", diff --git a/data/conditions.ts b/data/conditions.ts index 44406ca01a..9d6ee15ca2 100644 --- a/data/conditions.ts +++ b/data/conditions.ts @@ -484,7 +484,7 @@ export const Conditions: import('../sim/dex-conditions').ConditionDataTable = { return 5; }, onWeatherModifyDamage(damage, attacker, defender, move) { - if (defender.hasItem('utilityumbrella')) return; + if (defender.effectiveWeather() !== 'raindance') return; if (move.type === 'Water') { this.debug('rain water boost'); return this.chainModify(1.5); @@ -525,7 +525,7 @@ export const Conditions: import('../sim/dex-conditions').ConditionDataTable = { } }, onWeatherModifyDamage(damage, attacker, defender, move) { - if (defender.hasItem('utilityumbrella')) return; + if (defender.effectiveWeather() !== 'primordialsea') return; if (move.type === 'Water') { this.debug('Rain water boost'); return this.chainModify(1.5); @@ -554,11 +554,11 @@ export const Conditions: import('../sim/dex-conditions').ConditionDataTable = { return 5; }, onWeatherModifyDamage(damage, attacker, defender, move) { - if (move.id === 'hydrosteam' && !attacker.hasItem('utilityumbrella')) { + if (move.id === 'hydrosteam' && attacker.effectiveWeather() === 'sunnyday') { this.debug('Sunny Day Hydro Steam boost'); return this.chainModify(1.5); } - if (defender.hasItem('utilityumbrella')) return; + if (defender.effectiveWeather() !== 'sunnyday') return; if (move.type === 'Fire') { this.debug('Sunny Day fire boost'); return this.chainModify(1.5); @@ -577,7 +577,7 @@ export const Conditions: import('../sim/dex-conditions').ConditionDataTable = { } }, onImmunity(type, pokemon) { - if (pokemon.hasItem('utilityumbrella')) return; + if (pokemon.effectiveWeather() !== 'sunnyday') return; if (type === 'frz') return false; }, onFieldResidualOrder: 1, @@ -603,9 +603,9 @@ export const Conditions: import('../sim/dex-conditions').ConditionDataTable = { } }, onWeatherModifyDamage(damage, attacker, defender, move) { - if (defender.hasItem('utilityumbrella')) return; + if (defender.effectiveWeather() !== 'desolateland') return; if (move.type === 'Fire') { - this.debug('Sunny Day fire boost'); + this.debug('Desolate Land fire boost'); return this.chainModify(1.5); } }, @@ -613,7 +613,7 @@ export const Conditions: import('../sim/dex-conditions').ConditionDataTable = { this.add('-weather', 'DesolateLand', '[from] ability: ' + effect.name, `[of] ${source}`); }, onImmunity(type, pokemon) { - if (pokemon.hasItem('utilityumbrella')) return; + if (pokemon.effectiveWeather() !== 'desolateland') return; if (type === 'frz') return false; }, onFieldResidualOrder: 1, @@ -879,6 +879,67 @@ export const Conditions: import('../sim/dex-conditions').ConditionDataTable = { return [type]; }, }, + zacian: { + name: 'Zacian', + onBattleStart(pokemon) { + if (pokemon.item !== 'rustedsword') return; + const rawSpecies = this.dex.species.get('Zacian-Crowned'); + const species = pokemon.setSpecies(rawSpecies); + if (!species) return; + pokemon.baseSpecies = rawSpecies; + pokemon.details = pokemon.getUpdatedDetails(); + pokemon.setAbility(species.abilities['0'], null, null, true); + pokemon.baseAbility = pokemon.ability; + + const ironHeadIndex = pokemon.baseMoves.indexOf('ironhead'); + if (ironHeadIndex >= 0) { + const move = this.dex.moves.get('behemothblade'); + const pp = this.calculatePP(move, pokemon.ppUps[ironHeadIndex]); + pokemon.baseMoveSlots[ironHeadIndex] = { + move: move.name, + id: move.id, + pp, + maxpp: pp, + target: move.target, + disabled: false, + disabledSource: '', + used: false, + }; + pokemon.moveSlots = pokemon.baseMoveSlots.slice(); + } + }, + }, + zamazenta: { + name: 'Zamazenta', + onBattleStart(pokemon) { + if (pokemon.item !== 'rustedshield') return; + const rawSpecies = this.dex.species.get('Zamazenta-Crowned'); + const species = pokemon.setSpecies(rawSpecies); + if (!species) return; + pokemon.baseSpecies = rawSpecies; + pokemon.details = pokemon.getUpdatedDetails(); + pokemon.setAbility(species.abilities['0'], null, null, true); + pokemon.baseAbility = pokemon.ability; + + const ironHeadIndex = pokemon.baseMoves.indexOf('ironhead'); + if (ironHeadIndex >= 0) { + const move = this.dex.moves.get('behemothbash'); + const pp = this.calculatePP(move, pokemon.ppUps[ironHeadIndex]); + pokemon.baseMoveSlots[ironHeadIndex] = { + move: move.name, + id: move.id, + pp, + maxpp: pp, + target: move.target, + disabled: false, + disabledSource: '', + used: false, + }; + pokemon.moveSlots = pokemon.baseMoveSlots.slice(); + } + }, + }, + rolloutstorage: { name: 'rolloutstorage', duration: 2, diff --git a/data/formats-data.ts b/data/formats-data.ts index a7e8263fff..089d1860d0 100644 --- a/data/formats-data.ts +++ b/data/formats-data.ts @@ -101,7 +101,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = beedrillmega: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "UU", + natDexTier: "RU", }, pidgey: { isNonstandard: "Past", @@ -381,7 +381,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "NFE", }, vileplume: { - tier: "NU", + tier: "PU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -464,7 +464,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "LC", }, primeape: { - tier: "ZU", + tier: "NFE", doublesTier: "NFE", natDexTier: "NFE", }, @@ -475,7 +475,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "LC", }, arcanine: { - tier: "PU", + tier: "NU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -560,7 +560,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tentacruel: { tier: "NU", doublesTier: "(DUU)", - natDexTier: "UU", + natDexTier: "RU", }, geodude: { tier: "LC", @@ -613,7 +613,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = slowbro: { tier: "RU", doublesTier: "(DUU)", - natDexTier: "UU", + natDexTier: "OU", }, slowbromega: { isNonstandard: "Past", @@ -621,7 +621,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = natDexTier: "RUBL", }, slowbrogalar: { - tier: "NU", + tier: "PU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -696,7 +696,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = natDexTier: "RU", }, shellder: { - tier: "LC", + tier: "NFE", }, cloyster: { tier: "NUBL", @@ -1116,7 +1116,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "NFE", }, porygon2: { - tier: "ZUBL", + tier: "PU", doublesTier: "DUU", natDexTier: "NFE", }, @@ -1159,7 +1159,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "LC", }, snorlax: { - tier: "ZU", + tier: "PU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -1194,7 +1194,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = }, moltresgalar: { tier: "UUBL", - doublesTier: "DUU", + doublesTier: "DOU", natDexTier: "RUBL", }, dratini: { @@ -1228,7 +1228,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = natDexTier: "Uber", }, mew: { - tier: "RU", + tier: "UU", doublesTier: "DUU", natDexTier: "UU", }, @@ -1316,7 +1316,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "LC", }, lanturn: { - tier: "ZU", + tier: "PU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -1521,17 +1521,19 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = natDexTier: "RU", }, heracross: { - tier: "PUBL", + tier: "PU", doublesTier: "(DUU)", natDexTier: "RU", }, heracrossmega: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "UU", + natDexTier: "RUBL", }, sneasel: { - tier: "NFE", + tier: "ZU", + doublesTier: "NFE", + natDexTier: "NFE", }, sneaselhisui: { tier: "ZU", @@ -1557,7 +1559,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = ursaluna: { tier: "UUBL", doublesTier: "DOU", - natDexTier: "UU", + natDexTier: "RUBL", }, ursalunabloodmoon: { tier: "Uber", @@ -1579,7 +1581,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "NFE", }, mamoswine: { - tier: "RUBL", + tier: "UU", doublesTier: "(DUU)", natDexTier: "RUBL", }, @@ -1700,7 +1702,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tyranitarmega: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "UUBL", + natDexTier: "OU", }, lugia: { tier: "Uber", @@ -1758,7 +1760,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = swampert: { tier: "NU", doublesTier: "(DUU)", - natDexTier: "RU", + natDexTier: "UU", }, swampertmega: { isNonstandard: "Past", @@ -1877,11 +1879,11 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = gardevoirmega: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "RUBL", + natDexTier: "UU", }, gallade: { tier: "RU", - doublesTier: "(DUU)", + doublesTier: "DUU", natDexTier: "RU", }, gallademega: { @@ -1980,7 +1982,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = sableyemega: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "RUBL", + natDexTier: "UU", }, mawile: { isNonstandard: "Past", @@ -2096,7 +2098,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = sharpedomega: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "RU", + natDexTier: "RUBL", }, wailmer: { isNonstandard: "Past", @@ -2701,7 +2703,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "LC", }, skuntank: { - tier: "PU", + tier: "ZU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -2838,12 +2840,12 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = natDexTier: "RU", }, rotommow: { - tier: "ZU", + tier: "PU", doublesTier: "(DUU)", natDexTier: "RU", }, uxie: { - tier: "PU", + tier: "NU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -2926,7 +2928,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "Illegal", }, shaymin: { - tier: "ZU", + tier: "PU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -3136,7 +3138,9 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "LC", }, gurdurr: { - tier: "NFE", + tier: "ZU", + doublesTier: "NFE", + natDexTier: "NFE", }, conkeldurr: { tier: "UU", @@ -3290,7 +3294,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "NFE", }, scrafty: { - tier: "NU", + tier: "PU", doublesTier: "DUU", natDexTier: "RU", }, @@ -3646,7 +3650,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = mandibuzz: { tier: "UU", doublesTier: "(DUU)", - natDexTier: "UU", + natDexTier: "RU", }, heatmor: { isNonstandard: "Past", @@ -3665,7 +3669,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "NFE", }, hydreigon: { - tier: "RUBL", + tier: "UU", doublesTier: "(DUU)", natDexTier: "UU", }, @@ -3683,7 +3687,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = natDexTier: "RU", }, terrakion: { - tier: "NUBL", + tier: "RU", doublesTier: "(DUU)", natDexTier: "RUBL", }, @@ -3848,7 +3852,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "NFE", }, talonflame: { - tier: "RU", + tier: "UU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -4197,7 +4201,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = }, hoopaunbound: { tier: "UUBL", - doublesTier: "(DUU)", + doublesTier: "DUU", natDexTier: "UUBL", }, volcanion: { @@ -4241,7 +4245,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = primarina: { tier: "OU", doublesTier: "DOU", - natDexTier: "UU", + natDexTier: "RU", }, pikipek: { tier: "LC", @@ -4294,7 +4298,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "Illegal", }, oricorio: { - tier: "ZU", + tier: "ZUBL", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -4304,7 +4308,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = natDexTier: "RU", }, oricoriopau: { - tier: "ZU", + tier: "ZUBL", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -4342,7 +4346,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = natDexTier: "RU", }, lycanrocdusk: { - tier: "RU", + tier: "NUBL", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -4448,7 +4452,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = natDexTier: "RU", }, passimian: { - tier: "ZU", + tier: "PU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -4460,7 +4464,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = golisopod: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "UU", + natDexTier: "RU", }, golisopodmega: { isNonstandard: "Future", @@ -4717,7 +4721,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = natDexTier: "RU", }, necrozma: { - tier: "NUBL", + tier: "RU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -4777,7 +4781,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = zeraora: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "RU", + natDexTier: "UU", }, zeraoramega: { isNonstandard: "Future", @@ -4808,7 +4812,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = rillaboom: { tier: "OU", doublesTier: "DOU", - natDexTier: "UU", + natDexTier: "OU", }, rillaboomgmax: { isNonstandard: "Past", @@ -4998,7 +5002,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "LC", }, barraskewda: { - tier: "NU", + tier: "RU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -5006,7 +5010,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = tier: "LC", }, toxtricity: { - tier: "NU", + tier: "RU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -5154,7 +5158,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = dracozolt: { isNonstandard: "Past", tier: "Illegal", - natDexTier: "UU", + natDexTier: "RU", }, arctozolt: { isNonstandard: "Past", @@ -5322,7 +5326,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = quaquaval: { tier: "UUBL", doublesTier: "(DUU)", - natDexTier: "UU", + natDexTier: "RUBL", }, lechonk: { tier: "LC", @@ -5351,7 +5355,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = lokix: { tier: "UU", doublesTier: "(DUU)", - natDexTier: "UU", + natDexTier: "RU", }, rellor: { tier: "LC", @@ -5548,7 +5552,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = garganacl: { tier: "OU", doublesTier: "DUU", - natDexTier: "UU", + natDexTier: "RU", }, glimmet: { tier: "LC", @@ -5556,7 +5560,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = glimmora: { tier: "OU", doublesTier: "DOU", - natDexTier: "RU", + natDexTier: "UU", }, glimmoramega: { isNonstandard: "Future", @@ -5686,7 +5690,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = natDexTier: "Uber", }, wochien: { - tier: "NU", + tier: "PU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -5727,7 +5731,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = ceruledge: { tier: "OU", doublesTier: "(DUU)", - natDexTier: "UUBL", + natDexTier: "OU", }, toedscool: { tier: "LC", @@ -5772,8 +5776,8 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = }, okidogi: { tier: "UUBL", - doublesTier: "(DUU)", - natDexTier: "RUBL", + doublesTier: "DOU", + natDexTier: "UUBL", }, munkidori: { tier: "NU", @@ -5786,7 +5790,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = natDexTier: "RU", }, ogerpon: { - tier: "UU", + tier: "OU", doublesTier: "(DUU)", natDexTier: "RU", }, @@ -5828,7 +5832,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = ironboulder: { tier: "UUBL", doublesTier: "(DUU)", - natDexTier: "UU", + natDexTier: "RUBL", }, ironcrown: { tier: "OU", @@ -5848,7 +5852,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = pecharunt: { tier: "OU", doublesTier: "(DUU)", - natDexTier: "UU", + natDexTier: "UUBL", }, missingno: { isNonstandard: "Custom", @@ -6162,6 +6166,10 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable = isNonstandard: "CAP", tier: "CAP", }, + flox: { + isNonstandard: "CAP", + tier: "CAP LC", + }, shox: { isNonstandard: "CAP", tier: "CAP", diff --git a/data/items.ts b/data/items.ts index 1ffb717568..fb53bdc56e 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,14 +46,12 @@ 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, + num: 2638, gen: 9, isNonstandard: "Future", }, @@ -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,14 +403,12 @@ 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, + num: 2648, gen: 9, isNonstandard: "Future", }, @@ -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,14 +938,12 @@ 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, + num: 2637, gen: 9, isNonstandard: "Future", }, @@ -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,14 +1214,12 @@ 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, + num: 2644, gen: 9, isNonstandard: "Future", }, @@ -1357,14 +1311,12 @@ 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, + num: 2568, gen: 9, isNonstandard: "Future", }, @@ -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,14 +1967,12 @@ 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, + num: 2587, gen: 9, isNonstandard: "Future", }, @@ -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,26 +2413,22 @@ 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, + num: 2640, gen: 9, isNonstandard: "Future", }, 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,14 +2503,12 @@ 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, + num: 2650, gen: 9, isNonstandard: "Future", }, @@ -2609,28 +2524,24 @@ 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, + num: 2645, gen: 9, isNonstandard: "Future", }, 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, + num: 2642, gen: 9, isNonstandard: "Future", }, @@ -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,14 +2824,12 @@ 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, + num: 2567, gen: 9, isNonstandard: "Future", }, @@ -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, @@ -3469,8 +3362,8 @@ export const Items: import('../sim/dex-items').ItemDataTable = { const moveSlot = pokemon.moveSlots.find(move => move.pp === 0) || pokemon.moveSlots.find(move => move.pp < move.maxpp); if (!moveSlot) return; - moveSlot.pp += 10; - if (moveSlot.pp > moveSlot.maxpp) moveSlot.pp = moveSlot.maxpp; + const addedPP = pokemon.hasAbility('ripen') ? 20 : 10; + moveSlot.pp = Math.min(moveSlot.pp + addedPP, moveSlot.maxpp); this.add('-activate', pokemon, 'item: Leppa Berry', moveSlot.move, '[consumed]'); }, num: 154, @@ -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,14 +3504,12 @@ 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, + num: 2641, gen: 9, isNonstandard: "Future", }, @@ -3772,14 +3659,16 @@ 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, + num: 2646, gen: 9, isNonstandard: "Future", }, @@ -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,26 +3922,26 @@ 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, + num: 2643, gen: 9, isNonstandard: "Future", }, 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,30 +5030,24 @@ 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, + num: 2635, gen: 9, isNonstandard: "Future", }, 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, + num: 2636, gen: 9, isNonstandard: "Future", }, @@ -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,26 +5561,22 @@ 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, + num: 2647, gen: 9, isNonstandard: "Future", }, 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,14 +5972,12 @@ 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, + num: 2639, gen: 9, isNonstandard: "Future", }, @@ -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,14 +6261,17 @@ 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, + num: 2649, gen: 9, isNonstandard: "Future", }, @@ -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,14 +7808,12 @@ 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, + num: 2586, gen: 9, isNonstandard: "Future", }, @@ -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..717977dcf2 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"}, ], @@ -49730,12 +49734,85 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = { }, gastrodoneast: { learnset: { - earthpower: ["9S3", "9S2", "8S1", "8S0"], - icebeam: ["9S2", "8S1", "8S0"], - icywind: ["9S3"], - protect: ["9S3", "9S2", "8S1", "8S0"], - surf: ["8S0"], - yawn: ["9S3", "9S2", "8S1"], + amnesia: ["9M", "8M"], + ancientpower: ["9L20", "8L20", "4T"], + attract: ["8M", "7M", "6M", "5M", "4M"], + blizzard: ["9M", "8M", "7M", "6M", "5M", "4M"], + block: ["7T", "6T", "5T", "4T"], + bodyslam: ["9M", "9L25", "8M", "8L25", "7L29", "6L29", "5L29", "4L29"], + brine: ["8M", "4M"], + bulldoze: ["9M", "8M", "7M", "6M", "5M"], + captivate: ["4M"], + chillingwater: ["9M"], + confide: ["7M", "6M"], + curse: ["9M"], + dig: ["9M", "8M", "6M", "5M", "4M"], + dive: ["8M", "6M", "5M", "4T"], + doubleteam: ["7M", "6M", "5M", "4M"], + earthpower: ["9M", "9L39", "9S2", "9S3", "8M", "8L39", "8S0", "8S1", "7T", "6T", "5T", "4T"], + earthquake: ["9M", "8M", "7M", "6M", "5M", "4M"], + endure: ["9M", "8M", "4M"], + facade: ["9M", "8M", "7M", "6M", "5M", "4M"], + flash: ["6M", "5M", "4M"], + frustration: ["7M", "6M", "5M", "4M"], + gigaimpact: ["9M", "8M", "7M", "6M", "5M", "4M"], + hail: ["8M", "7M", "6M", "5M", "4M"], + harden: ["9L1", "8L1", "7L1", "6L1", "5L1", "4L1"], + headbutt: ["4T"], + helpinghand: ["9M"], + hiddenpower: ["7M", "7L16", "6M", "6L16", "5M", "5L16", "4M", "4L16"], + hydropump: ["9M", "8M"], + hyperbeam: ["9M", "8M", "7M", "6M", "5M", "4M"], + icebeam: ["9M", "9S2", "8M", "8S0", "8S1", "7M", "6M", "5M", "4M"], + icywind: ["9M", "9S3", "8M", "7T", "6T", "5T", "4T"], + infestation: ["7M", "6M"], + liquidation: ["9M"], + memento: ["9L53", "8L53"], + mudbomb: ["7L11", "6L11", "5L11", "4L11"], + muddywater: ["9M", "9L33", "8M", "8L33", "7L41", "6L41", "5L41", "4L41"], + mudshot: ["9M", "8M"], + mudslap: ["9M", "9L1", "8L1", "7L1", "6L1", "5L1", "4T", "4L1"], + mudsport: ["7L1", "6L1", "5L1", "4L1"], + naturalgift: ["4M"], + painsplit: ["9M", "7T", "6T", "5T", "4T"], + protect: ["9M", "9S2", "9S3", "8M", "8S0", "8S1", "7M", "6M", "5M", "4M"], + raindance: ["9M", "9L46", "8M", "8L46", "7M", "7L22", "6M", "6L22", "5M", "5L22", "4M", "4L22"], + recover: ["9L1", "8L1", "7L54", "6L54", "5L54", "4L54"], + rest: ["9M", "8M", "7M", "6M", "5M", "4M"], + return: ["7M", "6M", "5M", "4M"], + rockblast: ["9M"], + rockslide: ["9M", "8M", "7M", "6M", "5M", "4M"], + rocksmash: ["6M", "5M", "4M"], + rocktomb: ["9M", "8M", "7M", "6M", "5M", "4M"], + round: ["8M", "7M", "6M", "5M"], + sandstorm: ["9M", "8M", "7M", "6M", "5M", "4M"], + sandtomb: ["9M", "8M"], + scald: ["8M", "7M", "6M", "5M"], + secretpower: ["6M", "4M"], + skittersmack: ["9M", "8T"], + sleeptalk: ["9M", "8M", "7M", "6M", "5T", "4M"], + sludgebomb: ["9M", "8M", "7M", "6M", "5M", "4M"], + sludgewave: ["9M", "8M", "7M", "6M", "5M"], + snore: ["8M", "7T", "6T", "5T", "4T"], + snowscape: ["9M"], + spikes: ["9M"], + stealthrock: ["9M"], + stompingtantrum: ["9M", "8M", "7T"], + stoneedge: ["9M", "8M", "7M", "6M", "5M", "4M"], + strength: ["6M", "5M", "4M"], + stringshot: ["4T"], + substitute: ["9M", "8M", "7M", "6M", "5M", "4M"], + surf: ["9M", "8M", "8S0", "7M", "6M", "5M", "4M"], + swagger: ["7M", "6M", "5M", "4M"], + takedown: ["9M"], + terablast: ["9M"], + toxic: ["7M", "6M", "5M", "4M"], + waterfall: ["9M", "8M", "7M", "6M", "5M", "4M"], + watergun: ["9L1", "8L1"], + waterpulse: ["9M", "9L15", "8L15", "7T", "7L1", "6T", "6L1", "5L1", "4M", "4L1"], + weatherball: ["9M", "8M"], + whirlpool: ["9M", "8M", "4M"], + yawn: ["9S2", "9S3", "8S1"], }, eventData: [ {generation: 8, level: 50, gender: "F", nature: "Quiet", abilities: ["stormdrain"], ivs: {hp: 31, atk: 2, def: 31, spa: 31, spd: 31, spe: 0}, moves: ["protect", "surf", "icebeam", "earthpower"], pokeball: "cherishball"}, @@ -53582,7 +53659,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"}, ], @@ -72938,10 +73015,79 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = { }, pumpkaboosuper: { learnset: { - astonish: ["6S0"], - scaryface: ["6S0"], - shadowsneak: ["6S0"], - trickortreat: ["6S0"], + allyswitch: ["8M", "7T"], + astonish: ["8L1", "7L1", "6L1", "6S0"], + attract: ["8M", "7M", "6M"], + bestow: ["7E", "6E"], + bulletseed: ["8M", "8L20", "7L26", "6L26"], + chargebeam: ["7M", "6M"], + confide: ["7M", "6M"], + confuseray: ["8L8", "7L1", "6L1"], + curse: ["8E", "7E"], + darkpulse: ["8M", "7M", "6M"], + destinybond: ["8E", "7E", "6E"], + disable: ["8E", "7E", "6E"], + doubleteam: ["7M", "6M"], + dreameater: ["7M", "6M"], + endure: ["8M"], + energyball: ["8M", "7M", "6M"], + explosion: ["7M", "6M"], + facade: ["8M", "7M", "6M"], + fireblast: ["8M", "7M", "6M"], + flamecharge: ["7M", "6M"], + flamethrower: ["8M", "7M", "6M"], + flash: ["6M"], + foulplay: ["8M", "7T", "6T"], + frustration: ["7M", "6M"], + gigadrain: ["8M", "7T", "6T"], + grassknot: ["8M", "7M", "6M"], + grassyglide: ["8T"], + gyroball: ["8M", "7M", "6M"], + hex: ["8M"], + hiddenpower: ["7M", "6M"], + imprison: ["8M"], + incinerate: ["6M"], + leechseed: ["8L16", "7L20", "6L20"], + lightscreen: ["8M", "7M", "6M"], + magiccoat: ["7T", "6T"], + mysticalfire: ["8M"], + naturepower: ["7M", "6M"], + painsplit: ["8L44", "7T", "7L42", "6T", "6L42"], + poltergeist: ["8T"], + protect: ["8M", "7M", "6M"], + psychic: ["8M", "7M", "6M"], + razorleaf: ["8L12", "7L16", "6L16"], + rest: ["8M", "7M", "6M"], + return: ["7M", "6M"], + rockslide: ["8M", "7M", "6M"], + rocksmash: ["6M"], + roleplay: ["7T", "6T"], + round: ["8M", "7M", "6M"], + safeguard: ["8M", "7M", "6M"], + scaryface: ["8M", "8L24", "7L4", "6L4", "6S0"], + secretpower: ["6M"], + seedbomb: ["8M", "8L32", "7T", "7L48", "6T", "6L48"], + shadowball: ["8M", "8L36", "7M", "7L36", "6M", "6L36"], + shadowsneak: ["8L4", "7L30", "6L30", "6S0"], + skillswap: ["8M", "7T", "6T"], + skittersmack: ["8T"], + sleeptalk: ["8M", "7M", "6M"], + sludgebomb: ["8M", "7M", "6M"], + snore: ["8M"], + solarbeam: ["8M", "7M", "6M"], + spite: ["7T", "6T"], + substitute: ["8M", "7M", "6M"], + sunnyday: ["8M", "7M", "6M"], + swagger: ["7M", "6M"], + synthesis: ["7T", "6T"], + telekinesis: ["7T"], + thief: ["8M", "7M", "6M"], + toxic: ["7M", "6M"], + trick: ["8M", "8L40", "7T", "7L1", "6T", "6L1"], + trickortreat: ["8L1", "7L23", "6L6", "6S0"], + trickroom: ["8M", "7M", "6M"], + willowisp: ["8M", "7M", "6M"], + worryseed: ["8L28", "7T", "7L11", "6T", "6L11"], }, eventData: [ {generation: 6, level: 50, moves: ["trickortreat", "astonish", "scaryface", "shadowsneak"], pokeball: "cherishball"}, @@ -73028,6 +73174,87 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = { worryseed: ["8L28", "7T", "7L11", "6T", "6L11"], }, }, + gourgeistsuper: { + learnset: { + allyswitch: ["8M", "7T"], + astonish: ["8L1", "7L1", "6L1"], + attract: ["8M", "7M", "6M"], + brutalswing: ["8M"], + bulletseed: ["8M", "8L20", "7L26", "6L26"], + chargebeam: ["7M", "6M"], + confide: ["7M", "6M"], + confuseray: ["8L1", "7L1", "6L1"], + darkpulse: ["8M", "7M", "6M"], + doubleteam: ["7M", "6M"], + dreameater: ["7M", "6M"], + endure: ["8M"], + energyball: ["8M", "7M", "6M"], + explosion: ["8L1", "7M", "7L1", "6M", "6L1"], + facade: ["8M", "7M", "6M"], + fireblast: ["8M", "7M", "6M"], + flamecharge: ["7M", "6M"], + flamethrower: ["8M", "7M", "6M"], + flash: ["6M"], + focusblast: ["8M", "7M", "6M"], + foulplay: ["8M", "7T", "6T"], + frustration: ["7M", "6M"], + gigadrain: ["8M", "7T", "6T"], + gigaimpact: ["8M", "7M", "6M"], + grassknot: ["8M", "7M", "6M"], + grassyglide: ["8T"], + gyroball: ["8M", "7M", "6M"], + hex: ["8M"], + hiddenpower: ["7M", "6M"], + hyperbeam: ["8M", "7M", "6M"], + imprison: ["8M"], + incinerate: ["6M"], + leechseed: ["8L16", "7L20", "6L20"], + lightscreen: ["8M", "7M", "6M"], + magiccoat: ["7T", "6T"], + moonblast: ["8L1"], + mysticalfire: ["8M"], + nastyplot: ["8M"], + naturepower: ["7M", "6M"], + painsplit: ["8L44", "7T", "7L42", "6T", "6L42"], + phantomforce: ["8M", "8L48", "7L1", "6L1"], + poltergeist: ["8T"], + powerwhip: ["8M"], + protect: ["8M", "7M", "6M"], + psychic: ["8M", "7M", "6M"], + razorleaf: ["8L12", "7L16", "6L16"], + rest: ["8M", "7M", "6M"], + return: ["7M", "6M"], + rockslide: ["8M", "7M", "6M"], + rocksmash: ["6M"], + roleplay: ["7T", "6T"], + round: ["8M", "7M", "6M"], + safeguard: ["8M", "7M", "6M"], + scaryface: ["8M", "8L24", "7L1", "6L4"], + secretpower: ["6M"], + seedbomb: ["8M", "8L32", "7T", "7L48", "6T", "6L48"], + shadowball: ["8M", "8L36", "7M", "7L36", "6M", "6L36"], + shadowsneak: ["8L1", "7L30", "6L30"], + skillswap: ["8M", "7T", "6T"], + skittersmack: ["8T"], + sleeptalk: ["8M", "7M", "6M"], + sludgebomb: ["8M", "7M", "6M"], + snore: ["8M"], + solarbeam: ["8M", "7M", "6M"], + spite: ["7T", "6T"], + substitute: ["8M", "7M", "6M"], + sunnyday: ["8M", "7M", "6M"], + swagger: ["7M", "6M"], + synthesis: ["7T", "6T"], + telekinesis: ["7T"], + thief: ["8M", "7M", "6M"], + toxic: ["7M", "6M"], + trick: ["8M", "8L40", "7T", "7L1", "6T", "6L1"], + trickortreat: ["8L1", "7L23", "6L6"], + trickroom: ["8M", "7M", "6M"], + willowisp: ["8M", "7M", "6M"], + worryseed: ["8L28", "7T", "7L11", "6T", "6L11"], + }, + }, bergmite: { learnset: { afteryou: ["7T", "6T"], @@ -84106,49 +84333,53 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = { }, sinisteaantique: { learnset: { - allyswitch: ["9E"], - aromatherapy: ["8S0"], - aromaticmist: ["9L6"], - astonish: ["9L1"], - batonpass: ["9M"], + allyswitch: ["9E", "8M"], + aromatherapy: ["8L30", "8S0"], + aromaticmist: ["9L6", "8L6"], + astonish: ["9L1", "8L1"], + batonpass: ["9M", "8M"], calmmind: ["9M"], celebrate: ["8S0"], confuseray: ["9M"], curse: ["9M"], - darkpulse: ["9M"], - endure: ["9M"], - facade: ["9M"], - foulplay: ["9M"], - gigadrain: ["9M", "9L36"], - hex: ["9M"], - imprison: ["9M"], + darkpulse: ["9M", "8M"], + endure: ["9M", "8M"], + facade: ["9M", "8M"], + foulplay: ["9M", "8M"], + gigadrain: ["9M", "9L36", "8M", "8L36"], + hex: ["9M", "8M"], + imprison: ["9M", "8M"], magicalleaf: ["9M"], - megadrain: ["9L12"], - memento: ["9L54", "8S0"], - metronome: ["9M", "8S0"], - nastyplot: ["9M", "9L42"], + megadrain: ["9L12", "8L12"], + memento: ["9L54", "8L54", "8S0"], + metronome: ["9M", "8M", "8S0"], + nastyplot: ["9M", "9L42", "8M", "8L42"], nightshade: ["9M"], - phantomforce: ["9M"], - poltergeist: ["9M"], - protect: ["9M"], + payback: ["8M"], + phantomforce: ["9M", "8M"], + poltergeist: ["9M", "8T"], + protect: ["9M", "8M", "8L18"], psybeam: ["9M"], - psychic: ["9M"], - psyshock: ["9M"], - rest: ["9M"], - shadowball: ["9M", "9L48"], - shellsmash: ["9L60"], + psychic: ["9M", "8M"], + psyshock: ["9M", "8M"], + rest: ["9M", "8M"], + round: ["8M"], + shadowball: ["9M", "9L48", "8M", "8L48"], + shellsmash: ["9L60", "8L60"], skillswap: ["9M"], - sleeptalk: ["9M"], + sleeptalk: ["9M", "8M"], + snore: ["8M"], spite: ["9M"], - storedpower: ["9M"], - substitute: ["9M"], - suckerpunch: ["9L24"], + storedpower: ["9M", "8M"], + substitute: ["9M", "8M"], + suckerpunch: ["9L24", "8L24"], sweetscent: ["9L30"], terablast: ["9M"], - trick: ["9M"], + trick: ["9M", "8M"], trickroom: ["9M"], - willowisp: ["9M"], - withdraw: ["9L1"], + willowisp: ["9M", "8M"], + withdraw: ["9L1", "8L1"], + wonderroom: ["8M"], }, eventData: [ {generation: 8, level: 50, isHidden: true, moves: ["memento", "metronome", "aromatherapy", "celebrate"], pokeball: "cherishball"}, @@ -84212,6 +84443,64 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = { wonderroom: ["8M"], }, }, + polteageistantique: { + learnset: { + allyswitch: ["8M"], + aromatherapy: ["8L30"], + aromaticmist: ["9L1", "8L1"], + astonish: ["9L1", "8L1"], + batonpass: ["9M", "8M"], + calmmind: ["9M"], + confuseray: ["9M"], + curse: ["9M", "9L66", "8L66"], + darkpulse: ["9M", "8M"], + endure: ["9M", "8M"], + facade: ["9M", "8M"], + foulplay: ["9M", "8M"], + gigadrain: ["9M", "9L36", "8M", "8L36"], + gigaimpact: ["9M", "8M"], + hex: ["9M", "8M"], + hyperbeam: ["9M", "8M"], + imprison: ["9M", "8M"], + lightscreen: ["9M", "8M"], + magicalleaf: ["9M"], + megadrain: ["9L1", "8L1"], + memento: ["9L54", "8L54"], + metronome: ["9M", "8M"], + nastyplot: ["9M", "9L42", "8M", "8L42"], + nightshade: ["9M"], + painsplit: ["9M"], + payback: ["8M"], + phantomforce: ["9M", "8M"], + poltergeist: ["9M", "8T"], + protect: ["9M", "9L18", "8M", "8L18"], + psybeam: ["9M"], + psychic: ["9M", "8M"], + psyshock: ["9M", "8M"], + reflect: ["9M", "8M"], + rest: ["9M", "8M"], + round: ["8M"], + selfdestruct: ["8M"], + shadowball: ["9M", "9L48", "8M", "8L48"], + shellsmash: ["9L60", "8L60"], + skillswap: ["9M"], + sleeptalk: ["9M", "8M"], + snore: ["8M"], + spite: ["9M"], + storedpower: ["9M", "8M"], + strengthsap: ["9L1", "8L1"], + substitute: ["9M", "8M"], + suckerpunch: ["9L24", "8L24"], + sweetscent: ["9L30"], + teatime: ["9L0", "8L0"], + terablast: ["9M"], + trick: ["9M", "8M"], + trickroom: ["9M"], + willowisp: ["9M", "8M"], + withdraw: ["9L1", "8L1"], + wonderroom: ["8M"], + }, + }, hatenna: { learnset: { afteryou: ["9E", "8E"], @@ -89284,7 +89573,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: { @@ -89471,10 +89760,43 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = { }, tatsugiristretchy: { learnset: { + batonpass: ["9M", "9E"], celebrate: ["9S0"], - dracometeor: ["9S0"], - helpinghand: ["9S0"], - muddywater: ["9S0"], + chillingwater: ["9M"], + counter: ["9E"], + dracometeor: ["9M", "9S0"], + dragoncheer: ["9M"], + dragondance: ["9M"], + dragonpulse: ["9M", "9L52"], + endure: ["9M"], + facade: ["9M"], + gigaimpact: ["9M"], + harden: ["9L6"], + helpinghand: ["9M", "9L12", "9S0"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icywind: ["9M"], + lunge: ["9M"], + memento: ["9L34"], + mirrorcoat: ["9L47"], + muddywater: ["9M", "9L39", "9S0"], + nastyplot: ["9M", "9L43"], + outrage: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rapidspin: ["9E"], + rest: ["9M"], + sleeptalk: ["9M"], + soak: ["9L23"], + splash: ["9L1"], + substitute: ["9M"], + surf: ["9M"], + takedown: ["9M"], + taunt: ["9M", "9L28"], + terablast: ["9M"], + watergun: ["9L1"], + waterpulse: ["9M", "9L17"], + whirlpool: ["9M"], }, eventData: [ {generation: 9, level: 50, moves: ["dracometeor", "muddywater", "helpinghand", "celebrate"], pokeball: "cherishball"}, @@ -99770,6 +100092,67 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = { {generation: 9, level: 50, shiny: true, abilities: ["armortail"], moves: ["celebrate", "dragontail", "sludgebomb", "dragondance"], pokeball: "cherishball"}, ], }, + flox: { + learnset: { + blizzard: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + charge: ["9M", "9L15"], + chargebeam: ["9M"], + charm: ["9M", "9L15"], + dig: ["9M"], + disarmingvoice: ["9M"], + discharge: ["9L40"], + doubleedge: ["9M", "9L50"], + eerieimpulse: ["9M"], + electricterrain: ["9M"], + electroball: ["9M"], + electroweb: ["9M"], + endeavor: ["9M", "9E"], + endure: ["9M"], + facade: ["9M"], + glare: ["9E"], + growl: ["9L1"], + headbutt: ["9L20"], + helpinghand: ["9M"], + hypervoice: ["9M"], + icebeam: ["9M"], + icywind: ["9M"], + ironhead: ["9M"], + milkdrink: ["9L30"], + mudshot: ["9M"], + mudslap: ["9M"], + nuzzle: ["9E"], + playrough: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + seedbomb: ["9M"], + sleeptalk: ["9M"], + spark: ["9L25"], + spitup: ["9E"], + stockpile: ["9E"], + stompingtantrum: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superfang: ["9M"], + swallow: ["9E"], + tackle: ["9L1"], + takedown: ["9M", "9L35"], + terablast: ["9M"], + thief: ["9M"], + thunder: ["9M"], + thundershock: ["9L10"], + thunderwave: ["9M", "9L5"], + thunderbolt: ["9M"], + trailblaze: ["9M"], + uproar: ["9M"], + voltswitch: ["9M"], + wildcharge: ["9M"], + zapcannon: ["9L55"], + zenheadbutt: ["9M"], + }, + }, shox: { learnset: { blizzard: ["9M"], diff --git a/data/mods/afd/abilities.ts b/data/mods/afd/abilities.ts new file mode 100644 index 0000000000..f86b718bd7 --- /dev/null +++ b/data/mods/afd/abilities.ts @@ -0,0 +1,231 @@ +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { + chaossaliva: { + onSourceDamagingHit(damage, target, source, move) { + // Despite not being a secondary, Shield Dust / Covert Cloak block Poison Touch's effect + if (target.hasAbility('shielddust') || target.hasItem('covertcloak')) return; + if (this.checkMoveMakesContact(move, target, source)) { + if (this.randomChance(2, 10)) { + target.trySetStatus('par', source); + } + if (this.randomChance(2, 10)) { + target.addVolatile('confusion', source); + } + } + }, + flags: {}, + name: "Chaos Saliva", + gen: 9, + shortDesc: "Contact moves have a 20% chance to paralyze and a 20% chance to confuse.", + }, + faststart: { + onStart(pokemon) { + this.add('-start', pokemon, 'ability: Fast Start'); + this.effectState.counter = 5; + }, + onResidualOrder: 28, + onResidualSubOrder: 2, + onResidual(pokemon) { + if (pokemon.activeTurns && this.effectState.counter) { + this.effectState.counter--; + if (!this.effectState.counter) { + this.add('-end', pokemon, 'Fast Start'); + delete this.effectState.counter; + } + } + }, + onModifyAtkPriority: 5, + onModifyAtk(atk, pokemon) { + if (this.effectState.counter) { + return this.chainModify(2); + } + }, + onModifySpe(spe, pokemon) { + if (this.effectState.counter) { + return this.chainModify(2); + } + }, + onEnd(pokemon) { + if (pokemon.beingCalledBack) return; + this.add('-end', pokemon, 'Fast Start', '[silent]'); + }, + flags: {}, + name: "Fast Start", + rating: -1, + gen: 9, + }, + ironfist: { + inherit: true, + onBasePower(basePower, attacker, defender, move) { + if (move.flags['punch']) { + this.debug('Iron Fist boost'); + return this.chainModify([8192, 4096]); + } + }, + }, + supermegalauncher: { + onBasePowerPriority: 19, + onBasePower(basePower, attacker, defender, move) { + if (move.flags['pulse']) { + return this.chainModify(4); + } + }, + flags: {}, + name: "Mega Launcher", + desc: "This Pokemon's pulse moves have their power multiplied by 4. Heal Pulse restores 8/4 of a target's maximum HP, rounded half down.", + shortDesc: "This Pokemon's pulse moves have 4x power. Heal Pulse heals 8/4 target's max HP.", + rating: 3, + gen: 9, + }, + discourage: { + onStart(pokemon) { + let activated = false; + for (const target of pokemon.adjacentFoes()) { + if (!activated) { + this.add('-ability', pokemon, 'Discourage', 'boost'); + activated = true; + } + if (target.volatiles['substitute']) { + this.add('-immune', target); + } else { + this.boost({ spa: -1 }, target, pokemon, null, true); + } + } + }, + flags: {}, + name: "Discourage", + rating: 3.5, + num: 999, + gen: 9, + }, + adaptability: { + inherit: true, + onModifySTAB(stab, source, target, move) { + if (move.forceSTAB || source.hasType(move.type)) { + const types = source.getTypes(); + if (types[0] === move.type) return 2.3; + if (types[1] && types[1] === move.type) return 1.6; + if (stab === 2.3) { + return 2.55; + } + return 2.7; + } + }, + }, + icebody: { + inherit: true, + onDamagingHit(damage, target, source, move) { + if (this.checkMoveMakesContact(move, source, target)) { + if (this.randomChance(1, 10)) { + source.trySetStatus('frz', target); + } + } + }, + }, + noretreat: { + onStart(target) { + this.add('-start', target, 'move: No Retreat'); + }, + onFoeBeforeSwitchOut(pokemon) { + if (!pokemon || pokemon.fainted || pokemon.hp <= 0 || pokemon.hasAbility('noretreat')) return; + const success = !!this.damage(pokemon.maxhp / 4, pokemon, this.effectState.target); + if (success) { + pokemon.tryTrap(); + } + }, + name: "No Retreat", + flags: { breakable: 1 }, + }, + itsexcadrillintime: { + onModifySpe(spe, pokemon) { + if (this.field.isWeather('sandstorm')) { + return this.chainModify(2); + } + }, + onImmunity(type, pokemon) { + if (type === 'sandstorm') return false; + }, + onBasePowerPriority: 21, + onBasePower(basePower, attacker, defender, move) { + if (this.field.isWeather('sandstorm')) { + if (move.type === 'Rock' || move.type === 'Ground' || move.type === 'Steel') { + this.debug('Sand Force boost'); + return this.chainModify([5325, 4096]); + } + } + }, + name: "It's Excadrillin' Time!", + flags: {}, + }, + goodasgold: { + inherit: true, + onTryHit(target, source, move) { + if (move.category !== 'Special' && target !== source) { + this.add('-immune', target, '[from] ability: Good as Gold'); + return null; + } + }, + }, + intimidate2: { + onStart(pokemon) { + let activated = false; + let timesActivated = 0; + for (const target of pokemon.adjacentFoes()) { + if (!activated) { + this.add('-ability', pokemon, 'Intimidate 2', 'boost'); + activated = true; + } + if (target.volatiles['substitute']) { + this.add('-immune', target); + } else { + this.boost({ atk: -1 }, target, pokemon, null, true); + timesActivated++; + } + } + if (timesActivated > 0) { + for (let i = 0; i < timesActivated; i++) { + this.boost({ atk: 1 }, pokemon, pokemon, null, true); + } + } + }, + flags: {}, + name: "Intimidate 2", + rating: 3.5, + num: 22, + }, + asonemonarch: { + onSwitchInPriority: 1, + onStart(pokemon) { + if (this.effectState.unnerved) return; + this.add('-ability', pokemon, 'As One'); + this.add('-ability', pokemon, 'Unnerve'); + this.effectState.unnerved = true; + }, + onEnd() { + this.effectState.unnerved = false; + }, + onFoeTryEatItem() { + return !this.effectState.unnerved; + }, + flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 }, + name: "As One (Monarch)", + rating: 3.5, + num: 266, + }, + intimidate: { + inherit: true, + onStart(pokemon) { + let activated = false; + for (const target of pokemon.adjacentFoes()) { + if (!activated) { + this.add('-ability', pokemon, 'Intimidate', 'boost'); + activated = true; + } + if (target.volatiles['substitute']) { + this.add('-immune', target); + } else { + this.boost({ atk: -2 }, target, pokemon, null, true); + } + } + }, + }, +}; diff --git a/data/mods/afd/conditions.ts b/data/mods/afd/conditions.ts new file mode 100644 index 0000000000..12ee4b62c9 --- /dev/null +++ b/data/mods/afd/conditions.ts @@ -0,0 +1,22 @@ +export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = { + sandstorm: { + inherit: true, + onWeatherModifyDamage(damage, attacker, defender, move) { + if (defender.hasItem('utilityumbrella')) return; + if (move.type === 'Rock') { + this.debug('Sandstorm rock boost'); + return this.chainModify(1.5); + } + }, + }, + snowscape: { + inherit: true, + onModifySpePriority: 10, + onModifySpe(spe, pokemon) { + if (!pokemon.getTypes(false, true).includes('Ice') && !pokemon.getTypes(false, true).includes('Steel') && + !pokemon.hasAbility(['slushrush', 'snowcloak', 'iceface', 'icebody']) && pokemon.effectiveWeather() === 'snowscape') { + return this.modify(spe, 0.5); + } + }, + }, +}; diff --git a/data/mods/afd/items.ts b/data/mods/afd/items.ts new file mode 100644 index 0000000000..1828254175 --- /dev/null +++ b/data/mods/afd/items.ts @@ -0,0 +1,93 @@ +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { + hoots: { + name: "Hoots", + spritenum: 715, + fling: { + basePower: 80, + }, + num: 1120, + gen: 8, + // Hazard Immunity implemented in moves.ts + }, + luckycharm: { + name: "Lucky Charm", + onModifyMovePriority: -2, + onModifyMove(move, pokemon, target) { + let trigger = false; + if (move.secondaries) { + this.debug('doubling secondary chance'); + for (const secondary of move.secondaries) { + if (secondary.chance && secondary.chance < 100) { + secondary.chance = 100; + if (!trigger) trigger = true; + } + } + } + if (move.self?.chance) { + move.self.chance = 100; + trigger = true; + } + if (trigger) { + pokemon.useItem(); + } + }, + spritenum: 707, + fling: { + basePower: 120, + }, + num: 9999, + gen: 9, + }, + onikaburger: { + name: "Onika Burger", + desc: "PP and damage of every move is halved. Gain 25% max HP at the end of each turn.", + shortDesc: "PP and damage of every move is halved. Gain 25% max HP at the end of each turn.", + onStart(target) { + if (target.m.onikaBurger) return; + target.m.onikaBurger = true; + for (const moveSlot of target.moveSlots) { + const deductPP = target.deductPP(moveSlot.id, moveSlot.maxpp / 2, target); + if (!deductPP) continue; + this.add('-activate', target, 'item: Onika Burger', moveSlot.move, deductPP); + } + }, + onModifyDamage() { + return this.chainModify(0.5); + }, + onResidualOrder: 5, + onResidualSubOrder: 4, + onResidual(pokemon) { + this.heal(pokemon.baseMaxhp / 4); + }, + }, + wardtag: { + name: "Ward Tag", + desc: "Reflects back 125% of the damage that would've been dealt. One-time use.", + shortDesc: "Reflects back 125% of the damage that would've been dealt. One-time use.", + onDamage(damage, target, source, effect) { + if (source && target !== source && effect?.effectType === 'Move' && target.useItem()) { + this.add('-activate', target, 'item: Ward Tag'); + this.damage(damage * 5 / 4, source, target); + return 0; + } + }, + }, + strengthpolicy: { + name: "Strength Policy", + spritenum: 609, + fling: { + basePower: 80, + }, + onDamagingHit(damage, target, source, move) { + if (!move.damage && !move.damageCallback && target.getMoveHitData(move).typeMod < 0) { + target.useItem(); + } + }, + boosts: { + def: 2, + spd: 2, + }, + num: 639, + gen: 6, + }, +}; diff --git a/data/mods/afd/moves.ts b/data/mods/afd/moves.ts new file mode 100644 index 0000000000..d4723eda53 --- /dev/null +++ b/data/mods/afd/moves.ts @@ -0,0 +1,599 @@ +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { + banefulbunker: { + inherit: true, + condition: { + inherit: true, + onTryHit(target, source, move) { + if (this.checkMoveBypassesProtect(move, source, target)) return; + if (move.smartTarget) { + move.smartTarget = false; + } else { + if (!this.randomChance(2, 10)) { + this.add('-activate', target, 'move: Protect'); + if (move.basePower >= 100) { + this.add('message', '**BWUAHAAUAAAANGGGGGG**'); + } + } else { + return; + } + } + const lockedmove = source.getVolatile('lockedmove'); + if (lockedmove) { + // Outrage counter is reset + if (source.volatiles['lockedmove'].duration === 2) { + delete source.volatiles['lockedmove']; + } + } + if (this.checkMoveMakesContact(move, source, target)) { + source.trySetStatus('psn', target); + } + return this.NOT_FAIL; + }, + }, + }, + burningbulwark: { + inherit: true, + condition: { + inherit: true, + onTryHit(target, source, move) { + if (this.checkMoveBypassesProtect(move, source, target, false)) return; + if (move.smartTarget) { + move.smartTarget = false; + } else { + if (!this.randomChance(2, 10)) { + this.add('-activate', target, 'move: Protect'); + if (move.basePower >= 100) { + this.add('message', '**BWUAHAAUAAAANGGGGGG**'); + } + } else { + return; + } + } + const lockedmove = source.getVolatile('lockedmove'); + if (lockedmove) { + // Outrage counter is reset + if (source.volatiles['lockedmove'].duration === 2) { + delete source.volatiles['lockedmove']; + } + } + if (this.checkMoveMakesContact(move, source, target)) { + source.trySetStatus('brn', target); + } + return this.NOT_FAIL; + }, + }, + }, + kingsshield: { + inherit: true, + condition: { + inherit: true, + onTryHit(target, source, move) { + if (this.checkMoveBypassesProtect(move, source, target, false)) return; + if (move.smartTarget) { + move.smartTarget = false; + } else { + if (!this.randomChance(2, 10)) { + this.add('-activate', target, 'move: Protect'); + if (move.basePower >= 100) { + this.add('message', '**BWUAHAAUAAAANGGGGGG**'); + } + } else { + return; + } + } + const lockedmove = source.getVolatile('lockedmove'); + if (lockedmove) { + // Outrage counter is reset + if (source.volatiles['lockedmove'].duration === 2) { + delete source.volatiles['lockedmove']; + } + } + if (this.checkMoveMakesContact(move, source, target)) { + this.boost({ atk: -1 }, source, target, this.dex.getActiveMove("King's Shield")); + } + return this.NOT_FAIL; + }, + }, + }, + maxguard: { + inherit: true, + condition: { + inherit: true, + onTryHit(target, source, move) { + const bypassesMaxGuard = [ + 'acupressure', 'afteryou', 'allyswitch', 'aromatherapy', 'aromaticmist', 'coaching', 'confide', 'copycat', 'curse', 'decorate', 'doomdesire', 'feint', 'futuresight', 'gmaxoneblow', 'gmaxrapidflow', 'healbell', 'holdhands', 'howl', 'junglehealing', 'lifedew', 'meanlook', 'perishsong', 'playnice', 'powertrick', 'roar', 'roleplay', 'tearfullook', + ]; + if (bypassesMaxGuard.includes(move.id)) return; + if (move.smartTarget) { + move.smartTarget = false; + } else { + if (!this.randomChance(2, 10)) { + this.add('-activate', target, 'move: Protect'); + if (move.basePower >= 100) { + this.add('message', '**BWUAHAAUAAAANGGGGGG**'); + } + } else { + return; + } + } + const lockedmove = source.getVolatile('lockedmove'); + if (lockedmove) { + // Outrage counter is reset + if (source.volatiles['lockedmove'].duration === 2) { + delete source.volatiles['lockedmove']; + } + } + return this.NOT_FAIL; + }, + }, + }, + meteorbeam: { + inherit: true, + onTryMove(attacker, defender, move) { + if (attacker.removeVolatile(move.id)) { + return; + } + this.add('-prepare', attacker, move.name); + this.boost({ spa: 1 }, attacker, attacker, move); + if (['sandstorm'].includes(attacker.effectiveWeather())) { + this.attrLastMove('[still]'); + this.addMove('-anim', attacker, move.name, defender); + return; + } + if (!this.runEvent('ChargeMove', attacker, defender, move)) { + return; + } + attacker.addVolatile('twoturnmove', defender); + return null; + }, + }, + obstruct: { + inherit: true, + condition: { + inherit: true, + onTryHit(target, source, move) { + if (this.checkMoveBypassesProtect(move, source, target, false)) return; + if (move.smartTarget) { + move.smartTarget = false; + } else { + if (!this.randomChance(2, 10)) { + this.add('-activate', target, 'move: Protect'); + if (move.basePower >= 100) { + this.add('message', '**BWUAHAAUAAAANGGGGGG**'); + } + } else { + return; + } + } + const lockedmove = source.getVolatile('lockedmove'); + if (lockedmove) { + // Outrage counter is reset + if (source.volatiles['lockedmove'].duration === 2) { + delete source.volatiles['lockedmove']; + } + } + if (this.checkMoveMakesContact(move, source, target)) { + this.boost({ def: -2 }, source, target, this.dex.getActiveMove("Obstruct")); + } + return this.NOT_FAIL; + }, + }, + }, + protect: { + inherit: true, + condition: { + inherit: true, + onTryHit(target, source, move) { + if (this.checkMoveBypassesProtect(move, source, target)) return; + if (move.smartTarget) { + move.smartTarget = false; + } else { + if (!this.randomChance(2, 10)) { + this.add('-activate', target, 'move: Protect'); + if (move.basePower >= 100) { + this.add('message', '**BWUAHAAUAAAANGGGGGG**'); + } + } else { + return; + } + } + const lockedmove = source.getVolatile('lockedmove'); + if (lockedmove) { + // Outrage counter is reset + if (source.volatiles['lockedmove'].duration === 2) { + delete source.volatiles['lockedmove']; + } + } + return this.NOT_FAIL; + }, + }, + }, + silktrap: { + inherit: true, + condition: { + inherit: true, + onTryHit(target, source, move) { + if (this.checkMoveBypassesProtect(move, source, target, false)) return; + if (move.smartTarget) { + move.smartTarget = false; + } else { + if (!this.randomChance(2, 10)) { + this.add('-activate', target, 'move: Protect'); + if (move.basePower >= 100) { + this.add('message', '**BWUAHAAUAAAANGGGGGG**'); + } + } else { + return; + } + } + const lockedmove = source.getVolatile('lockedmove'); + if (lockedmove) { + // Outrage counter is reset + if (source.volatiles['lockedmove'].duration === 2) { + delete source.volatiles['lockedmove']; + } + } + if (this.checkMoveMakesContact(move, source, target)) { + this.boost({ spe: -1 }, source, target, this.dex.getActiveMove("Silk Trap")); + } + return this.NOT_FAIL; + }, + }, + }, + spikyshield: { + inherit: true, + condition: { + inherit: true, + onTryHit(target, source, move) { + if (this.checkMoveBypassesProtect(move, source, target)) return; + if (move.smartTarget) { + move.smartTarget = false; + } else { + if (!this.randomChance(2, 10)) { + this.add('-activate', target, 'move: Protect'); + if (move.basePower >= 100) { + this.add('message', '**BWUAHAAUAAAANGGGGGG**'); + } + } else { + return; + } + } + const lockedmove = source.getVolatile('lockedmove'); + if (lockedmove) { + // Outrage counter is reset + if (source.volatiles['lockedmove'].duration === 2) { + delete source.volatiles['lockedmove']; + } + } + if (this.checkMoveMakesContact(move, source, target)) { + this.damage(source.baseMaxhp / 8, source, target); + } + return this.NOT_FAIL; + }, + }, + }, + stealthrock: { + inherit: true, + condition: { + onSideStart(side) { + this.add('-sidestart', side, 'Stealth Rock'); + this.effectState.layers = 1; + }, + onSideRestart(side) { + if (this.effectState.layers >= 5) return false; + this.add('-sidestart', side, 'Stealth Rock'); + this.effectState.layers++; + }, + onSwitchIn(pokemon) { + if (pokemon.hasItem(['heavydutyboots', 'hoots'])) return; + const typeMod = this.clampIntRange(pokemon.runEffectiveness(this.dex.getActiveMove('stealthrock')), -6, 6); + const damageAmounts = [0, 1, 2, 3, 4, 5]; // 2 ** typeMod / 8 + this.damage((damageAmounts[this.effectState.layers] / 5) * pokemon.maxhp * ((2 ** typeMod) / 8)); + }, + }, + }, + gmaxsteelsurge: { + inherit: true, + condition: { + onSideStart(side) { + this.add('-sidestart', side, 'G-Max Steelsurge'); + this.effectState.layers = 1; + }, + onSideRestart(side) { + if (this.effectState.layers >= 5) return false; + this.add('-sidestart', side, 'G-Max Steelsurge'); + this.effectState.layers++; + }, + onSwitchIn(pokemon) { + if (pokemon.hasItem(['heavydutyboots', 'hoots'])) return; + const steelHazard = this.dex.getActiveMove('Stealth Rock'); + steelHazard.type = 'Steel'; + const typeMod = this.clampIntRange(pokemon.runEffectiveness(steelHazard), -6, 6); + const damageAmounts = [0, 1, 2, 3, 4, 5]; // 2 ** typeMod / 8 + this.damage((damageAmounts[this.effectState.layers] / 5) * pokemon.maxhp * ((2 ** typeMod) / 8)); + }, + }, + }, + spikes: { + inherit: true, + condition: { + inherit: true, + onSwitchIn(pokemon) { + if (!pokemon.isGrounded() || pokemon.hasItem(['heavydutyboots', 'hoots'])) return; + const damageAmounts = [0, 3, 4, 6]; // 1/8, 1/6, 1/4 + this.damage(damageAmounts[this.effectState.layers] * pokemon.maxhp / 24); + }, + }, + }, + stickyweb: { + inherit: true, + condition: { + inherit: true, + onSwitchIn(pokemon) { + if (!pokemon.isGrounded() || pokemon.hasItem(['heavydutyboots', 'hoots'])) return; + this.add('-activate', pokemon, 'move: Sticky Web'); + this.boost({ spe: -1 }, pokemon, pokemon.side.foe.active[0], this.dex.getActiveMove('stickyweb')); + }, + }, + }, + toxicspikes: { + inherit: true, + condition: { + inherit: true, + onSwitchIn(pokemon) { + if (!pokemon.isGrounded()) return; + if (pokemon.hasType('Poison')) { + this.add('-sideend', pokemon.side, 'move: Toxic Spikes', `[of] ${pokemon}`); + pokemon.side.removeSideCondition('toxicspikes'); + } else if (pokemon.hasType('Steel') || pokemon.hasItem(['heavydutyboots', 'hoots'])) { + // do nothing + } else if (this.effectState.layers >= 2) { + pokemon.trySetStatus('tox', pokemon.side.foe.active[0]); + } else { + pokemon.trySetStatus('psn', pokemon.side.foe.active[0]); + } + }, + }, + }, + suckerpunch: { + inherit: true, + onTry() { }, + onModifyPriority(priority, source, target, move) { + if (!target) return priority - 1; + const action = this.queue.willMove(target); + const aMove = action?.choice === 'move' ? action.move : null; + if (!aMove || (aMove.category === 'Status' && aMove.id !== 'mefirst') || target.volatiles['mustrecharge']) { + return priority - 1; + } + return priority; + }, + }, + thousandarrows: { + inherit: true, + basePower: 120, + }, + healpulse: { + inherit: true, + onHit(target, source) { + let success = false; + if (source.hasAbility('supermegalauncher')) { + success = !!this.heal(this.modify(target.baseMaxhp, 2)); + } else if (source.hasAbility('megalauncher')) { + success = !!this.heal(this.modify(target.baseMaxhp, 0.75)); + } else { + success = !!this.heal(Math.ceil(target.baseMaxhp * 0.5)); + } + if (success && !target.isAlly(source)) { + target.staleness = 'external'; + } + if (!success) { + this.add('-fail', target, 'heal'); + return this.NOT_FAIL; + } + return success; + }, + }, + headsmash: { + inherit: true, + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, heal: 1 }, + secondary: { + chance: 100, + onHit(target, source, move) { + if (!this.heal(this.modify(target.baseMaxhp, 0.25))) { + return this.NOT_FAIL; + } + }, + }, + }, + knockoff: { + inherit: true, + accuracy: 90, + }, + shitpulse: { + num: -400, + gen: 9, + accuracy: 100, + basePower: 75, + category: "Special", + name: "Shit Pulse", + pp: 15, + priority: 0, + flags: { protect: 1, mirror: 1, distance: 1, metronome: 1, pulse: 1 }, + secondary: { + chance: 30, + boosts: { + accuracy: -2, + }, + }, + target: "any", + type: "Poison", + shortDesc: "30% chance to lower foe's accuracy by 2.", + }, + solarflare: { + num: -4324534, + gen: 9, + accuracy: 100, + basePower: 75, + category: "Special", + name: "Solar Flare", + pp: 15, + priority: 0, + flags: { protect: 1, mirror: 1, metronome: 1 }, + secondary: { + chance: 50, + onHit(target, source, move) { + if (!['sunnyday', 'desolateland'].includes(target.effectiveWeather())) return; + target.trySetStatus('brn', source, move); + }, + }, + target: "normal", + type: "Fire", + shortDesc: "Sun active: 50% chance to burn.", + }, + onslaught: { + num: -3023, + gen: 9, + accuracy: 100, + basePower: 100, + category: "Physical", + name: "Onslaught", + pp: 5, + priority: 0, + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, + self: { + boosts: { + atk: -1, + def: -1, + }, + }, + target: "normal", + type: "Dark", + }, + scald: { + inherit: true, + onEffectiveness(typeMod, target, type) { + if (type === 'Steel') return 1; + }, + secondary: undefined, + secondaries: [{ + chance: 30, + status: 'brn', + }, { + chance: 100, + onHit(target, source, move) { + if (target.hasType(['Normal', 'Fairy'])) { + target.trySetStatus('brn', source, move); + } + }, + }], + }, + explosion: { + inherit: true, + onAfterMove(pokemon, target, move) { + if (target && target.hp <= 0) { + delete move.selfdestruct; + return; + } + }, + }, + selfdestruct: { + inherit: true, + onAfterMove(pokemon, target, move) { + if (target && target.hp <= 0) { + delete move.selfdestruct; + return; + } + }, + }, + mistyexplosion: { + inherit: true, + onAfterMove(pokemon, target, move) { + if (target && target.hp <= 0) { + delete move.selfdestruct; + return; + } + }, + }, + moonblast: { + inherit: true, + basePower: 90, + accuracy: 90, + secondary: { + chance: 10, + boosts: { + atk: -1, + }, + }, + category: "Physical", + }, + noretreat: { + name: "No Retreat", + // @ts-expect-error + exists: false, + }, + blastiodon: { + num: -306345534534523, + gen: 9, + accuracy: 100, + basePower: 0, + basePowerCallback(pokemon, target) { + const targetDef = target.getStat('def', false, true); + const pokemonDef = pokemon.getStat('def', false, true); + let bp; + if (pokemonDef >= targetDef * 5) { + bp = 150; + } else if (pokemonDef >= targetDef * 4) { + bp = 125; + } else if (pokemonDef >= targetDef * 3) { + bp = 100; + } else if (pokemonDef >= targetDef * 2) { + bp = 75; + } else { + bp = 50; + } + this.debug(`BP: ${bp}`); + return bp; + }, + category: "Physical", + name: "Blastiodon", + pp: 15, + priority: 0, + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, + overrideOffensiveStat: 'def', + secondary: { + chance: 50, + boosts: { + def: -1, + }, + }, + target: "normal", + type: "Rock", + shortDesc: "Higher user Def than target Def = higher BP.", + }, + focusblast: { + inherit: true, + accuracy: 100, + recoil: [1, 4], + category: "Physical", + }, + darkvoid: { + inherit: true, + onModifyMove(move, pokemon, target) { + if (pokemon.species.baseSpecies === 'Calyrex') { + move.accuracy = 80; + } + }, + onTry(source, target, move) { + if (source.species.baseSpecies === 'Darkrai' || source.species.baseSpecies === 'Calyrex' || move.hasBounced) { + return; + } + this.add('-fail', source, 'move: Dark Void'); + this.hint("Only a Pokemon whose form is Darkrai can use this move."); + return null; + }, + }, + rapidspin: { + inherit: true, + type: "Dark", + }, +}; diff --git a/data/mods/afd/pokedex.ts b/data/mods/afd/pokedex.ts new file mode 100644 index 0000000000..69e614f9c6 --- /dev/null +++ b/data/mods/afd/pokedex.ts @@ -0,0 +1,329 @@ +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { + seaking: { + inherit: true, + baseStats: { hp: 80, atk: 92, def: 65, spa: 65, spd: 80, spe: 98 }, + }, + clefablemega: { + inherit: true, + abilities: { 0: "Regenerator" }, + }, + victreebelmega: { + inherit: true, + abilities: { 0: "Regenerator" }, + }, + starmiemega: { + inherit: true, + abilities: { 0: "Huge Power" }, + }, + skarmorymega: { + inherit: true, + abilities: { 0: "Huge Power" }, + }, + scolipedemega: { + inherit: true, + abilities: { 0: "Huge Power" }, + }, + scraftymega: { + inherit: true, + abilities: { 0: "Huge Power" }, + }, + emboarmega: { + inherit: true, + abilities: { 0: "Regenerator" }, + }, + eelektrossmega: { + inherit: true, + abilities: { 0: "Regenerator" }, + }, + chesnaughtmega: { + inherit: true, + abilities: { 0: "Regenerator" }, + }, + delphoxmega: { + inherit: true, + abilities: { 0: "Regenerator" }, + }, + greninjamega: { + inherit: true, + abilities: { 0: "Regenerator" }, + }, + pyroarmega: { + inherit: true, + abilities: { 0: "Regenerator" }, + }, + barbaraclemega: { + inherit: true, + abilities: { 0: "Huge Power" }, + }, + hawluchamega: { + inherit: true, + abilities: { 0: "Huge Power" }, + }, + raichumegax: { + inherit: true, + abilities: { 0: "Huge Power" }, + }, + chimechomega: { + inherit: true, + abilities: { 0: "Regenerator" }, + }, + baxcaliburmega: { + inherit: true, + abilities: { 0: "Huge Power" }, + }, + zeraoramega: { + inherit: true, + abilities: { 0: "Huge Power" }, + }, + absolmegaz: { + inherit: true, + abilities: { 0: "Huge Power" }, + }, + staraptormega: { + inherit: true, + abilities: { 0: "Huge Power" }, + }, + golisopodmega: { + inherit: true, + abilities: { 0: "Huge Power" }, + }, + meowsticfmega: { + inherit: true, + abilities: { 0: "Regenerator" }, + }, + crabominablemega: { + inherit: true, + abilities: { 0: "Huge Power" }, + }, + golurkmega: { + inherit: true, + abilities: { 0: "Huge Power" }, + }, + garchompmegaz: { + inherit: true, + abilities: { 0: "Huge Power" }, + }, + lucariomegaz: { + inherit: true, + abilities: { 0: "Regenerator" }, + }, + raichumegay: { + inherit: true, + abilities: { 0: "Regenerator" }, + }, + falinksmega: { + inherit: true, + abilities: { 0: "No Retreat" }, + }, + drampamega: { + inherit: true, + abilities: { 0: "Regenerator" }, + }, + zygardemega: { + inherit: true, + abilities: { 0: "Regenerator" }, + }, + dragalgemega: { + inherit: true, + abilities: { 0: "Regenerator" }, + }, + darkraimega: { + inherit: true, + abilities: { 0: "Regenerator" }, + }, + heatranmega: { + inherit: true, + abilities: { 0: "Regenerator" }, + }, + floettemega: { + inherit: true, + abilities: { 0: "Regenerator" }, + }, + chandeluremega: { + inherit: true, + abilities: { 0: "Shadow Tag" }, + }, + lickitung: { + inherit: true, + abilities: { 0: "Own Tempo", 1: "Oblivious", H: "Chaos Saliva" }, + }, + mewtwo: { + inherit: true, + abilities: { 0: "Pressure", 1: "Neuroforce", H: "Unnerve" }, + }, + scovillainmega: { + inherit: true, + abilities: { 0: "Contrary" }, + }, + mew: { + inherit: true, + abilities: { 0: "Synchronize", 1: "Neuroforce" }, + }, + smeargle: { + inherit: true, + abilities: { 0: "Own Tempo", 1: "Prankster", H: "Moody" }, + }, + swampert: { + inherit: true, + abilities: { 0: "Torrent", 1: "Sap Sipper", H: "Damp" }, + }, + bibarel: { + inherit: true, + baseStats: { hp: 159, atk: 85, def: 60, spa: 55, spd: 60, spe: 151 }, + }, + skuntank: { + inherit: true, + baseStats: { hp: 103, atk: 93, def: 67, spa: 106, spd: 61, spe: 84 }, + abilities: { 0: "Stench", 1: "Aftermath", H: "Mega Launcher" }, + }, + rampardos: { + inherit: true, + baseStats: { hp: 97, atk: 225, def: 30, spa: 65, spd: 30, spe: 58 }, + abilities: { 0: "Rocky Payload", H: "Sheer Force" }, + }, + gallademega: { + inherit: true, + abilities: { 0: "Sharpness" }, + }, + garchompmega: { + inherit: true, + abilities: { 0: "Sand Rush" }, + }, + dusknoir: { + inherit: true, + abilities: { 0: "Damp" }, + }, + lickilicky: { + inherit: true, + abilities: { 0: "Own Tempo", 1: "Oblivious", H: "Chaos Saliva" }, + }, + regigigas: { + inherit: true, + abilities: { 0: "Slow Start", H: "Fast Start" }, + }, + serperior: { + inherit: true, + types: ['Grass', 'Dragon'], + baseStats: { hp: 75, atk: 75, def: 95, spa: 105, spd: 95, spe: 113 }, + }, + simisage: { + inherit: true, + baseStats: { hp: 120, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }, + }, + excadrillmega: { + inherit: true, + abilities: { 0: "It's Excadrillin' Time!" }, + }, + chandelure: { + inherit: true, + abilities: { 0: "Flash Fire", 1: "Flame Body", H: "Shadow Tag" }, + }, + delphox: { + inherit: true, + abilities: { 0: "Blaze", H: "Discourage" }, + }, + clawitzer: { + inherit: true, + abilities: { 0: "Super Mega Launcher" }, + }, + malamar: { + inherit: true, + baseStats: { hp: 101, atk: 112, def: 88, spa: 68, spd: 75, spe: 73 }, + }, + malamarmega: { + inherit: true, + baseStats: { hp: 101, atk: 122, def: 88, spa: 98, spd: 120, spe: 88 }, + abilities: { 0: "Contrary" }, + }, + incineroar: { + inherit: true, + types: ['Fire', 'Fighting'], + }, + incineroar2: { + num: 2000, + name: "Incineroar 2", + types: ["Ghost", "Steel"], + genderRatio: { M: 0.875, F: 0.125 }, + baseStats: { hp: 95, atk: 115, def: 90, spa: 80, spd: 90, spe: 60 }, + abilities: { 0: "Intimidate 2" }, + heightm: 1.8, + weightkg: 83, + color: "Red", + eggGroups: ["Field"], + }, + celesteela: { + inherit: true, + baseStats: { hp: 5, atk: 5, def: 5, spa: 5, spd: 5, spe: 5 }, + }, + hatterene: { + inherit: true, + types: ['Psychic', 'Dark'], + }, + glimmora: { + inherit: true, + baseStats: { hp: 106, atk: 150, def: 70, spa: 194, spd: 120, spe: 140 }, + }, + glimmoramega: { + inherit: true, + baseStats: { hp: 106, atk: 185, def: 85, spa: 214, spd: 145, spe: 155 }, + abilities: { 0: "Regenerator" }, + }, + tatsugiri: { + inherit: true, + abilities: { 0: "Commander", 1: "Parental Bond", H: "Storm Drain" }, + }, + tatsugiridroopy: { + inherit: true, + abilities: { 0: "Commander", 1: "Parental Bond", H: "Storm Drain" }, + }, + tatsugiristretchy: { + inherit: true, + abilities: { 0: "Commander", 1: "Parental Bond", H: "Storm Drain" }, + }, + tatsugiricurlymega: { + inherit: true, + abilities: { 0: "Parental Bond" }, + }, + tatsugiridroopymega: { + inherit: true, + abilities: { 0: "Parental Bond" }, + }, + tatsugiristretchymega: { + inherit: true, + abilities: { 0: "Parental Bond" }, + }, + calyrex: { + num: 898, + name: "Calyrex", + types: ["Psychic", "Grass"], + gender: "N", + baseStats: { hp: 100, atk: 80, def: 80, spa: 80, spd: 80, spe: 80 }, + abilities: { 0: "Unnerve" }, + heightm: 1.1, + weightkg: 7.7, + color: "Green", + eggGroups: ["Undiscovered"], + tags: ["Restricted Legendary"], + otherFormes: ["Calyrex-Ice", "Calyrex-Shadow", "Calyrex-Monarch"], + formeOrder: ["Calyrex", "Calyrex-Ice", "Calyrex-Shadow", "Calyrex-Monarch"], + }, + calyrexmonarch: { + num: 898, + name: "Calyrex-Monarch", + baseSpecies: "Calyrex", + forme: "Monarch", + types: ["Psychic", "Grass"], + gender: "N", + baseStats: { hp: 200, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }, + abilities: { 0: "As One (Calyrex)" }, + heightm: 2.2, + weightkg: 15.4, + color: "Green", + eggGroups: ["Undiscovered"], + changesFrom: "Calyrex", + }, + spidops: { + inherit: true, + baseStats: { hp: 100, atk: 100, def: 100, spa: 100, spd: 100, spe: 0 }, + }, +}; diff --git a/data/mods/afd/random-teams.ts b/data/mods/afd/random-teams.ts new file mode 100644 index 0000000000..d1639d9334 --- /dev/null +++ b/data/mods/afd/random-teams.ts @@ -0,0 +1,788 @@ +import { Utils } from '../../../lib'; +import RandomTeams from '../../random-battles/gen9/teams'; +import { toID } from '../../../sim/dex'; + +export interface TeamData { + typeCount: { [k: string]: number }; + typeComboCount: { [k: string]: number }; + baseFormes: { [k: string]: number }; + megaCount?: number; + zCount?: number; + wantsTeraCount?: number; + has: { [k: string]: number }; + forceResult: boolean; + weaknesses: { [k: string]: number }; + resistances: { [k: string]: number }; + weather?: string; + eeveeLimCount?: number; + gigantamax?: boolean; +} +export interface BattleFactorySpecies { + sets: BattleFactorySet[]; + weight: number; +} +interface BattleFactorySet { + species: string; + weight: number; + item: string[]; + ability: string[]; + nature: string[]; + moves: string[][]; + teraType: string[]; + gender?: string; + wantsTera?: boolean; + evs?: Partial; + ivs?: Partial; + shiny?: boolean; + level?: number; +} +export class MoveCounter extends Utils.Multiset { + damagingMoves: Set; + basePowerMoves: Set; + + constructor() { + super(); + this.damagingMoves = new Set(); + this.basePowerMoves = new Set(); + } +} +// Moves that switch the user out +const PIVOT_MOVES = [ + 'chillyreception', 'flipturn', 'partingshot', 'shedtail', 'teleport', 'uturn', 'voltswitch', +]; + +/** Pokemon who should never be in the lead slot */ +const NO_LEAD_POKEMON = [ + 'Zacian', 'Zamazenta', +]; + +const DEFENSIVE_TERA_BLAST_USERS = [ + 'alcremie', 'bellossom', 'comfey', 'fezandipiti', 'florges', +]; + +export class RandomAFDTeams extends RandomTeams { + override shouldCullAbility( + ability: string, + types: string[], + moves: Set, + abilities: string[], + counter: MoveCounter, + teamDetails: RandomTeamsTypes.TeamDetails, + species: Species, + isLead: boolean, + isDoubles: boolean, + teraType: string, + role: RandomTeamsTypes.Role, + ): boolean { + switch (ability) { + // Abilities which are primarily useful for certain moves or with team support + case 'Chlorophyll': case 'Solar Power': + return !teamDetails.sun; + case 'Defiant': + return (species.id === 'thundurus' && !!counter.get('Status')); + case 'Hydration': case 'Swift Swim': + return !teamDetails.rain; + case 'Iron Fist': case 'Skill Link': + return !counter.get(toID(ability)); + case 'Overgrow': + return !counter.get('Grass'); + case 'Prankster': + return !counter.get('Status'); + case 'Sand Force': case 'Sand Rush': case 'It\'s Excadrillin\' Time!': + return !teamDetails.sand; + case 'Slush Rush': + return !teamDetails.snow; + case 'Swarm': + return !counter.get('Bug'); + case 'Torrent': + return (!counter.get('Water') && !moves.has('flipturn')); + } + + return false; + } + + override getAbility( + types: string[], + moves: Set, + abilities: string[], + counter: MoveCounter, + teamDetails: RandomTeamsTypes.TeamDetails, + species: Species, + isLead: boolean, + isDoubles: boolean, + teraType: string, + role: RandomTeamsTypes.Role, + ): string { + if (abilities.length <= 1) return abilities[0]; + + // 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 === 'thundurus' || species.id === 'tornadus') && !counter.get('Physical')) return 'Prankster'; + if (species.id === 'toucannon' && counter.get('skilllink')) return 'Skill Link'; + if (abilities.includes('Slush Rush') && moves.has('snowscape')) return 'Slush Rush'; + if (species.id === 'golduck' && teamDetails.rain) return 'Swift Swim'; + + const abilityAllowed: string[] = []; + // Obtain a list of abilities that are allowed (not culled) + for (const ability of abilities) { + if (!this.shouldCullAbility( + ability, types, moves, abilities, counter, teamDetails, species, isLead, isDoubles, teraType, role + )) { + abilityAllowed.push(ability); + } + } + + // Pick a random allowed ability + if (abilityAllowed.length >= 1) return this.sample(abilityAllowed); + + // If all abilities are rejected, prioritize weather abilities over non-weather abilities + if (!abilityAllowed.length) { + const weatherAbilities = abilities.filter( + a => ['Chlorophyll', 'Hydration', 'Sand Force', 'Sand Rush', 'Slush Rush', 'Solar Power', 'Swift Swim'].includes(a) + ); + if (weatherAbilities.length) return this.sample(weatherAbilities); + } + + // Pick a random ability + return this.sample(abilities); + } + + 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 (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 && species.baseSpecies !== 'Magearna') { + // 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 (species.id === 'pikachu') return 'Light Ball'; + if (role === 'AV Pivot') return 'Assault Vest'; + if (species.id === 'regieleki') return 'Magnet'; + if (types.includes('Normal') && moves.has('doubleedge') && moves.has('fakeout')) return 'Silk Scarf'; + if ( + species.id === 'froslass' || moves.has('populationbomb') || + (ability === 'Hustle' && counter.get('setup') && !isDoubles && this.randomChance(1, 2)) + ) return 'Wide Lens'; + if (species.id === 'smeargle') return 'Focus Sash'; + if (moves.has('clangoroussoul') || (species.id === 'toxtricity' && moves.has('shiftgear'))) return 'Throat Spray'; + if ( + (species.baseSpecies === 'Magearna' && role === 'Tera Blast user') || + ((species.id === 'calyrexice' || species.id === 'necrozmaduskmane') && isDoubles) + ) return 'Weakness Policy'; + if (['dragonenergy', 'lastrespects', 'waterspout'].some(m => moves.has(m))) return 'Choice Scarf'; + if ( + !isDoubles && (ability === 'Imposter' || (species.id === 'magnezone' && role === 'Fast Attacker')) + ) return 'Choice Scarf'; + if (species.id === 'rampardos' && (role === 'Fast Attacker' || isDoubles)) return 'Choice Scarf'; + if (species.id === 'palkia' && counter.get('Status')) return 'Lustrous Orb'; + if ( + moves.has('courtchange') || + !isDoubles && (species.id === 'luvdisc' || (species.id === 'terapagos' && !moves.has('rest'))) + ) return 'Hoots'; + if (['Cheek Pouch', 'Cud Chew', 'Harvest', 'Ripen'].some(m => ability === m)) { + return 'Sitrus Berry'; + } + if (moves.has('bellydrum') || moves.has('filletaway')) return 'Ward Tag'; + 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 (counter.get('Status') && (species.name === 'Latias' || species.name === 'Latios')) return 'Soul Dew'; + if (species.id === 'scyther' && !isDoubles) return (isLead && !moves.has('uturn')) ? 'Eviolite' : 'Hoots'; + if (ability === 'Poison Heal' || ability === 'Quick Feet') return 'Toxic Orb'; + if (species.nfe) return 'Eviolite'; + if ((ability === 'Guts' || moves.has('facade')) && !moves.has('sleeptalk')) { + return (types.includes('Fire') || ability === 'Toxic Boost') ? 'Toxic Orb' : 'Flame Orb'; + } + if (ability === 'Magic Guard' || (ability === 'Sheer Force' && counter.get('sheerforce'))) return 'Life Orb'; + if (ability === 'Anger Shell') return this.sample(['Expert Belt', 'Lum Berry', 'Scope Lens', 'Sitrus Berry']); + if (moves.has('dragondance') && isDoubles) return 'Clear Amulet'; + if (counter.get('skilllink') && ability !== 'Skill Link' && species.id !== 'breloom') return 'Loaded Dice'; + if (ability === 'Unburden') { + return (moves.has('closecombat') || moves.has('leafstorm')) ? 'White Herb' : 'Sitrus Berry'; + } + if (moves.has('shellsmash') && ability !== 'Weak Armor') return 'White Herb'; + if (moves.has('meteorbeam') || (moves.has('electroshot') && !teamDetails.rain)) return 'Power Herb'; + if (moves.has('acrobatics') && 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 (species.id === 'giratina' && !isDoubles && moves.has('rest') && !moves.has('sleeptalk')) return 'Leftovers'; + if ( + moves.has('rest') && !moves.has('sleeptalk') && + ability !== 'Natural Cure' && ability !== 'Shed Skin' + ) { + return 'Chesto Berry'; + } + if ( + species.id !== 'yanmega' && + this.dex.getEffectiveness('Rock', species) >= 2 && (!types.includes('Flying') || !isDoubles) + ) return 'Hoots'; + } + + override getItem( + ability: string, + types: string[], + moves: Set, + counter: MoveCounter, + teamDetails: RandomTeamsTypes.TeamDetails, + species: Species, + isLead: boolean, + teraType: string, + role: RandomTeamsTypes.Role, + ): string { + const lifeOrbReqs = ['flamecharge', 'nuzzle', 'rapidspin'].every(m => !moves.has(m)); + + if ( + species.id !== 'jirachi' && (counter.get('Physical') >= moves.size) && + ['dragontail', 'fakeout', 'firstimpression', 'flamecharge', 'rapidspin', 'trailblaze'].every(m => !moves.has(m)) + ) { + const scarfReqs = ( + role !== 'Wallbreaker' && + (species.baseStats.atk >= 100 || ability === 'Huge Power' || ability === 'Pure Power') && + species.baseStats.spe >= 60 && species.baseStats.spe <= 108 && + ability !== 'Speed Boost' && !counter.get('priority') + ); + return (scarfReqs && this.randomChance(1, 2)) ? 'Choice Scarf' : 'Choice Band'; + } + if ( + (counter.get('Special') >= moves.size) || + (counter.get('Special') >= moves.size - 1 && ['flipturn', 'uturn'].some(m => moves.has(m))) + ) { + const scarfReqs = ( + role !== 'Wallbreaker' && + species.baseStats.spa >= 100 && + species.baseStats.spe >= 60 && species.baseStats.spe <= 108 && + ability !== 'Speed Boost' && ability !== 'Tinted Lens' && !moves.has('uturn') && !counter.get('priority') + ); + return (scarfReqs && this.randomChance(1, 2)) ? 'Choice Scarf' : 'Choice Specs'; + } + if (counter.get('speedsetup') && !counter.get('physicalsetup') && role === 'Bulky Setup') return 'Weakness Policy'; + if ( + !counter.get('Status') && + !['Fast Attacker', 'Wallbreaker', 'Tera Blast user'].includes(role) + ) { + return 'Assault Vest'; + } + if (species.id === 'golem') return (counter.get('speedsetup')) ? 'Weakness Policy' : 'Custap Berry'; + if (moves.has('substitute')) return 'Leftovers'; + if ( + moves.has('stickyweb') && isLead && + (species.baseStats.hp + species.baseStats.def + species.baseStats.spd) <= 235 + ) return 'Focus Sash'; + if (this.dex.getEffectiveness('Rock', species) >= 1) return 'Hoots'; + if ( + (moves.has('chillyreception') || ( + role === 'Fast Support' && + [...PIVOT_MOVES, 'defog', 'mortalspin', 'rapidspin'].some(m => moves.has(m)) && + !types.includes('Flying') && ability !== 'Levitate' + )) + ) return 'Hoots'; + + // Low Priority + if (moves.has('dragondance') && role === 'Bulky Setup') return 'Weakness Policy'; + if ( + ability === 'Rough Skin' || ( + ability === 'Regenerator' && (role === 'Bulky Support' || role === 'Bulky Attacker') && + (species.baseStats.hp + species.baseStats.def) >= 180 && this.randomChance(1, 2) + ) || ( + ability !== 'Regenerator' && !counter.get('setup') && counter.get('recovery') && + this.dex.getEffectiveness('Fighting', species) < 1 && + (species.baseStats.hp + species.baseStats.def) > 200 && this.randomChance(1, 2) + ) + ) return 'Rocky Helmet'; + if (role === 'Bulky Support') return 'Onika Burger'; + if (moves.has('outrage') && counter.get('setup')) return 'Lum Berry'; + if (moves.has('protect') && ability !== 'Speed Boost') return 'Leftovers'; + if ( + role === 'Fast Support' && isLead && !counter.get('recovery') && !counter.get('recoil') && + (counter.get('hazards') || counter.get('setup')) && + (species.baseStats.hp + species.baseStats.def + species.baseStats.spd) < 258 + ) return 'Focus Sash'; + if ( + !counter.get('setup') && ability !== 'Levitate' && this.dex.getEffectiveness('Ground', species) >= 2 + ) return 'Air Balloon'; + if (['Bulky Attacker', 'Bulky Setup'].some(m => role === (m))) return 'Leftovers'; + if (species.id === 'pawmot' && moves.has('nuzzle')) return 'Leppa Berry'; + if (role === 'Fast Support' || role === 'Fast Bulky Setup') { + return ( + counter.get('Physical') + counter.get('Special') > counter.get('Status') && lifeOrbReqs + ) ? 'Life Orb' : 'Leftovers'; + } + if (role === 'Tera Blast user' && DEFENSIVE_TERA_BLAST_USERS.includes(species.id)) return 'Leftovers'; + if ( + lifeOrbReqs && ['Fast Attacker', 'Setup Sweeper', 'Tera Blast user', 'Wallbreaker'].some(m => role === (m)) + ) return 'Life Orb'; + return 'Leftovers'; + } + + override getLevel(species: Species): number { + if (this.adjustLevel) return this.adjustLevel; + const file = this.randomAFDSets[species.id] || this.randomSets[species.id]; + if (file["level"]) return file["level"]; + // Default to tier-based levelling + const tier = species.tier; + const tierScale: Partial> = { + Uber: 76, + OU: 80, + UUBL: 81, + UU: 82, + RUBL: 83, + RU: 84, + NUBL: 85, + NU: 86, + PUBL: 87, + PU: 88, "(PU)": 88, NFE: 88, + }; + return tierScale[tier] || 80; + } + + override getForme(species: Species): string { + if (typeof species.battleOnly === 'string') { + // Only change the forme. The species has custom moves, and may have different typing and requirements. + return species.battleOnly; + } + if (species.cosmeticFormes) return this.sample([species.name].concat(species.cosmeticFormes)); + + // Consolidate mostly-cosmetic formes, at least for the purposes of Random Battles + if (['Dudunsparce', 'Maushold', 'Polteageist', 'Sinistcha', 'Zarude'].includes(species.baseSpecies)) { + return this.sample([species.name].concat(species.otherFormes!)); + } + if (species.baseSpecies === 'Basculin') return 'Basculin' + this.sample(['', '-Blue-Striped']); + if (species.baseSpecies === 'Magearna') return 'Magearna' + this.sample(['', '-Original']); + if (species.baseSpecies === 'Pikachu') { + return 'Pikachu' + this.sample( + ['', '-Original', '-Hoenn', '-Sinnoh', '-Unova', '-Kalos', '-Alola', '-Partner', '-World'] + ); + } + return species.name; + } + + randomAFDSet( + s: string | Species, + teamDetails: RandomTeamsTypes.TeamDetails = {}, + isLead = false, + isDoubles = false + ): RandomTeamsTypes.RandomSet { + const species = this.dex.species.get(s); + const forme = this.getForme(species); + if (!this.randomAFDSets[species.id]) return this.randomSet(species, teamDetails, isLead, isDoubles); + const sets = this.randomAFDSets[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 || ruleTable.has('terastalclause')) && set.role === 'Tera Blast user') { + continue; + } + possibleSets.push(set); + } + const set = this.sampleIfArray(possibleSets); + const role = set.role; + const movePool: string[] = []; + for (const movename of set.movepool) { + movePool.push(this.dex.moves.get(movename).id); + } + const teraTypes = set.teraTypes!; + let teraType = this.sampleIfArray(teraTypes); + + let ability = ''; + let item = undefined; + + const evs = { hp: 85, atk: 85, def: 85, spa: 85, spd: 85, spe: 85 }; + const ivs = { hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31 }; + + const types = species.types; + const abilities = 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) { + item = this.getItem(ability, types, moves, counter, teamDetails, species, isLead, teraType, role); + } + + // Get level + const level = this.getLevel(species); + + // Prepare optimal HP + const srImmunity = ability === 'Magic Guard' || item === 'Heavy-Duty Boots' || item === 'Hoots'; + 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', 'supercellslam'].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'].includes(item)) || species.id === 'minior') { + // Two Substitutes should activate Sitrus Berry. Two switch-ins to Stealth Rock should activate Shields Down on Minior. + if (hp % 4 === 0) break; + } else if ( + (moves.has('bellydrum') || moves.has('filletaway') || moves.has('shedtail')) && + (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 in singles + if (isDoubles) break; + if (srWeakness <= 0 || ability === 'Regenerator' || ['Leftovers', 'Life Orb'].includes(item)) break; + if (item !== 'Sitrus Berry' && hp % (4 / srWeakness) > 0) break; + // Minimise number of Stealth Rock switch-ins to activate Sitrus Berry + if (item === 'Sitrus Berry' && hp % (4 / srWeakness) === 0) break; + } + evs.hp -= 4; + } + + // Minimize confusion damage + const noAttackStatMoves = [...moves].every(m => { + const move = this.dex.moves.get(m); + if (move.damageCallback || move.damage) return true; + if (move.id === 'shellsidearm') return false; + // Physical Tera Blast + if ( + move.id === 'terablast' && (species.id === 'porygon2' || ['Contrary', 'Defiant'].includes(ability) || + moves.has('shiftgear') || species.baseStats.atk > species.baseStats.spa) + ) return false; + return move.category !== 'Physical' || move.id === 'bodypress' || move.id === 'foulplay'; + }); + if ( + noAttackStatMoves && !moves.has('transform') && this.format.mod !== 'partnersincrime' && + !ruleTable.has('forceofthefallenmod') + ) { + evs.atk = 0; + ivs.atk = 0; + } + + if (moves.has('gyroball') || moves.has('trickroom')) { + evs.spe = 0; + ivs.spe = 0; + } + + // Enforce Tera Type after all set generation is done to prevent infinite generation + if (this.forceTeraType) teraType = this.forceTeraType; + + // shuffle moves to add more randomness to camomons + const shuffledMoves = Array.from(moves); + this.prng.shuffle(shuffledMoves); + let name = species.baseSpecies; + if (name === "Bruxish") name = "Brux"; + return { + name, + species: forme, + speciesId: species.id, + 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, + }; + } + + /** + * Checks if the new species is compatible with the other mons currently on the team. + */ + override getPokemonCompatibility( + species: Species, + pokemon: RandomTeamsTypes.RandomSet[] + ): boolean { + const webSetters = [ + 'ariados', 'smeargle', 'masquerain', 'kricketune', 'leavanny', 'galvantula', 'vikavolt', 'ribombee', 'araquanid', 'spidops', + ]; + const screenSetters = ['meowstic', 'grimmsnarl', 'ninetalesalola', 'abomasnow']; + + const sunSetters = ['ninetales', 'torkoal', 'groudon', 'koraidon']; + + const incompatiblePokemon = [ + // These Pokemon with support roles are considered too similar to each other. + ['blissey', 'chansey'], + ['illumise', 'volbeat'], + + // These combinations are prevented to avoid double webs or screens. + [webSetters, webSetters], + [screenSetters, screenSetters], + + // These Pokemon are incompatible because the presence of one actively harms the other. + // Prevent Dry Skin + sun setting ability + ['toxicroak', sunSetters], + ]; + + const incompatibilityList = incompatiblePokemon; + for (const pair of incompatibilityList) { + const monsArrayA = (Array.isArray(pair[0])) ? pair[0] : [pair[0]]; + const monsArrayB = (Array.isArray(pair[1])) ? pair[1] : [pair[1]]; + if (monsArrayB.includes(species.id)) { + if (pokemon.some(m => monsArrayA.includes(m.speciesId!))) return false; + } + if (monsArrayA.includes(species.id)) { + if (pokemon.some(m => monsArrayB.includes(m.speciesId!))) return false; + } + } + + return true; + } + + randomAFDSets: { [species: string]: RandomTeamsTypes.RandomSpeciesData } = require('./sets.json'); + + override randomTeam() { + this.enforceNoDirectCustomBanlistChanges(); + + const seed = this.prng.getSeed(); + const ruleTable = this.dex.formats.getRuleTable(this.format); + const pokemon: RandomTeamsTypes.RandomSet[] = []; + + // 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 = {}; + let numMaxLevelPokemon = 0; + + const pokemonList = Object.keys(this.randomSets); + const afdList = Object.keys(this.randomAFDSets); + const zaMegaList = Object.keys(this.randomAFDSets).filter(x => ( + this.dex.species.get(x).isMega && this.dex.species.get(x).gen === 9 + )); + const [pokemonPool, baseSpeciesPool] = this.getPokemonPool('', pokemon, false, pokemonList); + const [afdPool, baseAfdPool] = this.getPokemonPool('', pokemon, false, afdList); + const [zaMegaPool, zaBaseMegaPool] = this.getPokemonPool('', pokemon, false, zaMegaList); + + let leadsRemaining = this.format.gameType === 'doubles' ? 2 : 1; + while (baseSpeciesPool.length && pokemon.length < this.maxTeamSize) { + let baseSpecies, species; + if (pokemon.length === 0) { + baseSpecies = this.sampleNoReplace(zaBaseMegaPool); + species = this.dex.species.get(this.sample(zaMegaPool[baseSpecies])); + } else if (this.randomChance(1, 5)) { + baseSpecies = this.sampleNoReplace(baseAfdPool); + species = this.dex.species.get(this.sample(afdPool[baseSpecies])); + } else { + baseSpecies = this.sampleNoReplace(baseSpeciesPool); + species = this.dex.species.get(this.sample(pokemonPool[baseSpecies])); + } + if (!species.exists) continue; + + // Limit to one of each species (Species Clause) + if (baseFormes[species.baseSpecies]) continue; + + // Treat Ogerpon formes and Terapagos like the Tera Blast user role; reject if team has one already + if (['ogerpon', 'ogerponhearthflame', 'terapagos'].includes(species.id) && teamDetails.teraBlast) continue; + + // Illusion shouldn't be on the last slot + if (species.baseSpecies === 'Zoroark' && pokemon.length >= (this.maxTeamSize - 1)) continue; + + const types = species.types; + const typeCombo = types.slice().sort().join(); + const weakToFreezeDry = ( + this.dex.getEffectiveness('Ice', species) > 0 || + (this.dex.getEffectiveness('Ice', species) > -2 && types.includes('Water')) + ); + const weakToScald = ( + this.dex.getEffectiveness('Water', species) > 0 || + (this.dex.getEffectiveness('Water', species) > -2 && types.includes('Steel')) + ); + // Dynamically scale limits for different team sizes. The default and minimum value is 1. + const limitFactor = Math.round(this.maxTeamSize / 6) || 1; + + let skip = false; + + // Limit two of any type + for (const typeName of types) { + if (typeCount[typeName] >= 2 * limitFactor) { + skip = true; + break; + } + } + if (skip) continue; + + // Limit three weak to any type, and one double weak to any type + for (const typeName of this.dex.types.names()) { + // it's weak to the type + if (this.dex.getEffectiveness(typeName, species) > 0) { + if (!typeWeaknesses[typeName]) typeWeaknesses[typeName] = 0; + if (typeWeaknesses[typeName] >= 3 * limitFactor) { + skip = true; + break; + } + } + if (this.dex.getEffectiveness(typeName, species) > 1) { + if (!typeDoubleWeaknesses[typeName]) typeDoubleWeaknesses[typeName] = 0; + if (typeDoubleWeaknesses[typeName] >= limitFactor) { + skip = true; + break; + } + } + } + if (skip) continue; + + // Count Dry Skin/Fluffy as Fire weaknesses + if ( + this.dex.getEffectiveness('Fire', species) === 0 && + Object.values(species.abilities).filter(a => ['Dry Skin', 'Fluffy'].includes(a)).length + ) { + if (!typeWeaknesses['Fire']) typeWeaknesses['Fire'] = 0; + if (typeWeaknesses['Fire'] >= 3 * limitFactor) continue; + } + + // Limit four weak to Freeze-Dry + if (weakToFreezeDry) { + if (!typeWeaknesses['Freeze-Dry']) typeWeaknesses['Freeze-Dry'] = 0; + if (typeWeaknesses['Freeze-Dry'] >= 4 * limitFactor) continue; + } + if (weakToScald) { + if (!typeWeaknesses['Scald']) typeWeaknesses['Scald'] = 0; + if (typeWeaknesses['Scald'] >= 4 * limitFactor) continue; + } + + // Limit one level 100 Pokemon + if (!this.adjustLevel && (this.getLevel(species) === 100) && numMaxLevelPokemon >= limitFactor) { + continue; + } + + // Check compatibility with team + if (!this.getPokemonCompatibility(species, pokemon)) continue; + + // The Pokemon of the Day + if (potd?.exists && (pokemon.length === 1 || this.maxTeamSize === 1)) species = potd; + + let set: RandomTeamsTypes.RandomSet; + + if (leadsRemaining) { + if (NO_LEAD_POKEMON.includes(species.baseSpecies)) { + if (pokemon.length + leadsRemaining === this.maxTeamSize) continue; + set = this.randomAFDSet(species, teamDetails, false); + pokemon.push(set); + } else { + set = this.randomAFDSet(species, teamDetails, true); + pokemon.unshift(set); + leadsRemaining--; + } + } else { + set = this.randomAFDSet(species, teamDetails, false); + pokemon.push(set); + } + + // Don't bother tracking details for the last Pokemon + if (pokemon.length === this.maxTeamSize) break; + + // Now that our Pokemon has passed all checks, we can increment our counters + baseFormes[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']++; + if (weakToScald) typeWeaknesses['Scald']++; + + // 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' || ['ogerpon', 'ogerponhearthflame', 'terapagos'].includes(species.id)) { + 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 RandomAFDTeams; diff --git a/data/mods/afd/scripts.ts b/data/mods/afd/scripts.ts new file mode 100644 index 0000000000..362e7c2185 --- /dev/null +++ b/data/mods/afd/scripts.ts @@ -0,0 +1,626 @@ +export const Scripts: ModdedBattleScriptsData = { + gen: 9, + init() { + for (const id in this.data.Pokedex) { + const species = this.data.Pokedex[id]; + if (species.isCosmeticForme) continue; + if (species.types.includes('Ground')) { + if (this.data.Learnsets[id]?.learnset) this.modData('Learnsets', id).learnset.thousandarrows = ['9L1']; + } + if (species.types.includes('Grass') && !species.types.includes('Fire')) { + if (this.data.Learnsets[id]?.learnset) this.modData('Learnsets', id).learnset.solarflare = ['9L1']; + } + const abilities = this.modData('Pokedex', id, true).abilities; + if (species.baseStats['atk'] >= 130) { + const hasHP = Object.values(abilities).includes('Huge Power') || + Object.values(abilities).includes('Pure Power'); + if (!hasHP) { + const slot = !abilities['1'] ? '1' : !abilities['H'] ? 'H' : 'S'; + abilities[slot] ||= 'Huge Power'; + } + } + const hasRegen = Object.values(abilities).includes('Regenerator'); + if (!hasRegen) { + const slot = !abilities['1'] ? '1' : !abilities['H'] ? 'H' : 'S'; + abilities[slot] ||= 'Regenerator'; + } + } + this.modData('Learnsets', 'tyranitar').learnset.shoreup = ['9L1']; + this.modData('Learnsets', 'bastiodon').learnset.blastiodon = ['9L1']; + this.modData('Learnsets', 'seaking').learnset.boltbeak = ['9L1']; + this.modData('Learnsets', 'seaking').learnset.fishiousrend = ['9L1']; + this.modData('Learnsets', 'ampharos').learnset.tailglow = ['9L1']; + this.modData('Learnsets', 'ampharos').learnset.dracometeor = ['9L1']; + this.modData('Learnsets', 'serperior').learnset.dracometeor = ['9L1']; + this.modData('Learnsets', 'serperior').learnset.overheat = ['9L1']; + this.modData('Learnsets', 'serperior').learnset.makeitrain = ['9L1']; + this.modData('Learnsets', 'rampardos').learnset.accelerock = ['9L1']; + this.modData('Learnsets', 'bibarel').learnset.bellydrum = ['9L1']; + this.modData('Learnsets', 'bibarel').learnset.storedpower = ['9L1']; + this.modData('Learnsets', 'bibarel').learnset.powertrip = ['9L1']; + this.modData('Learnsets', 'golisopod').learnset.bellydrum = ['9L1']; + this.modData('Learnsets', 'skuntank').learnset.shitpulse = ['9L1']; + this.modData('Learnsets', 'dusknoir').learnset = { explosion: ['9L1'] }; + for (const move of this.moves.all()) { + if (move.flags['bite']) { + this.modData('Learnsets', 'bruxish').learnset[move.id] = ['9L1']; + } + } + for (const moveid in this.data.Learnsets['incineroar'].learnset) { + if (this.moves.get(moveid).type === 'Dark') { + delete this.modData('Learnsets', 'incineroar').learnset[moveid]; + } + } + }, + actions: { + runMegaEvo(pokemon: Pokemon) { + const speciesid = pokemon.canMegaEvo || pokemon.canUltraBurst; + if (!speciesid) return false; + + pokemon.formeChange(speciesid, pokemon.getItem(), true); + + // Limit one mega evolution + pokemon.canMegaEvo = null; + + this.battle.runEvent('AfterMega', pokemon); + return true; + }, + switchIn(pokemon, pos, sourceEffect = null, isDrag) { + if (!pokemon || pokemon.isActive) { + this.battle.hint("A switch failed because the Pokémon trying to switch in is already in."); + return false; + } + + const side = pokemon.side; + if (pos >= side.active.length) { + throw new Error(`Invalid switch position ${pos} / ${side.active.length}`); + } + const oldActive = side.active[pos]; + const unfaintedActive = oldActive?.hp ? oldActive : null; + if (unfaintedActive) { + oldActive.beingCalledBack = true; + let switchCopyFlag: 'copyvolatile' | 'shedtail' | boolean = false; + if (sourceEffect && typeof (sourceEffect as Move).selfSwitch === 'string') { + switchCopyFlag = (sourceEffect as Move).selfSwitch!; + } + if (!oldActive.skipBeforeSwitchOutEventFlag && !isDrag) { + this.battle.runEvent('BeforeSwitchOut', oldActive); + if (this.battle.gen >= 5) { + this.battle.eachEvent('Update'); + } + } + oldActive.skipBeforeSwitchOutEventFlag = false; + if (!this.battle.runEvent('SwitchOut', oldActive)) { + // Warning: DO NOT interrupt a switch-out if you just want to trap a pokemon. + // To trap a pokemon and prevent it from switching out, (e.g. Mean Look, Magnet Pull) + // use the 'trapped' flag instead. + + // Note: Nothing in the real games can interrupt a switch-out (except Pursuit KOing, + // which is handled elsewhere); this is just for custom formats. + return false; + } + if (!oldActive.hp) { + // a pokemon fainted from Pursuit before it could switch + return 'pursuitfaint'; + } + + // will definitely switch out at this point + + this.battle.singleEvent('End', oldActive.getAbility(), oldActive.abilityState, oldActive); + this.battle.singleEvent('End', oldActive.getItem(), oldActive.itemState, oldActive); + + // if a pokemon is forced out by Whirlwind/etc or Eject Button/Pack, it can't use its chosen move + this.battle.queue.cancelAction(oldActive); + + let newMove = null; + if (this.battle.gen === 4 && sourceEffect) { + newMove = oldActive.lastMove; + } + if (switchCopyFlag) { + pokemon.copyVolatileFrom(oldActive, switchCopyFlag); + } + if (newMove) pokemon.lastMove = newMove; + oldActive.clearVolatile(); + } + if (oldActive) { + oldActive.isActive = false; + oldActive.isStarted = false; + oldActive.usedItemThisTurn = false; + oldActive.statsRaisedThisTurn = false; + oldActive.statsLoweredThisTurn = false; + oldActive.position = pokemon.position; + if (oldActive.fainted) oldActive.status = ''; + if (this.battle.gen <= 4) { + pokemon.lastItem = oldActive.lastItem; + oldActive.lastItem = ''; + } + pokemon.position = pos; + side.pokemon[pokemon.position] = pokemon; + side.pokemon[oldActive.position] = oldActive; + } + pokemon.isActive = true; + side.active[pos] = pokemon; + pokemon.activeTurns = 0; + pokemon.activeMoveActions = 0; + for (const moveSlot of pokemon.moveSlots) { + moveSlot.used = false; + } + pokemon.abilityState = this.battle.initEffectState({ id: pokemon.ability, target: pokemon }); + pokemon.itemState = this.battle.initEffectState({ id: pokemon.item, target: pokemon }); + this.battle.runEvent('BeforeSwitchIn', pokemon); + if (sourceEffect) { + this.battle.add(isDrag ? 'drag' : 'switch', pokemon, pokemon.getFullDetails, `[from] ${sourceEffect}`); + } else { + this.battle.add(isDrag ? 'drag' : 'switch', pokemon, pokemon.getFullDetails); + } + if (isDrag && this.battle.gen === 2) pokemon.draggedIn = this.battle.turn; + pokemon.previouslySwitchedIn++; + + if (isDrag && this.battle.gen >= 5) { + // runSwitch happens immediately so that Mold Breaker can make hazards bypass Clear Body and Levitate + this.runSwitch(pokemon); + } else { + this.battle.queue.insertChoice({ choice: 'runSwitch', pokemon }); + } + + if (pokemon.hasType('Flying')) { + this.battle.field.addPseudoWeather('Tailwind', pokemon); + } + + return true; + }, + useMoveInner(moveOrMoveName, pokemon, options) { + let target = options?.target; + let sourceEffect = options?.sourceEffect; + const zMove = options?.zMove; + const maxMove = options?.maxMove; + if (!sourceEffect && this.battle.effect.id) sourceEffect = this.battle.effect; + if (sourceEffect && ['instruct', 'custapberry'].includes(sourceEffect.id)) sourceEffect = null; + + let move = this.dex.getActiveMove(moveOrMoveName); + pokemon.lastMoveUsed = move; + if (move.id === 'weatherball' && zMove) { + // Z-Weather Ball only changes types if it's used directly, + // not if it's called by Z-Sleep Talk or something. + this.battle.singleEvent('ModifyType', move, null, pokemon, target, move, move); + if (move.type !== 'Normal') sourceEffect = move; + } + if (zMove || (move.category !== 'Status' && sourceEffect && (sourceEffect as ActiveMove).isZ)) { + move = this.getActiveZMove(move, pokemon); + } + if (maxMove && move.category !== 'Status') { + // Max move outcome is dependent on the move type after type modifications from ability and the move itself + this.battle.singleEvent('ModifyType', move, null, pokemon, target, move, move); + this.battle.runEvent('ModifyType', pokemon, target, move, move); + } + if (maxMove || (move.category !== 'Status' && sourceEffect && (sourceEffect as ActiveMove).isMax)) { + move = this.getActiveMaxMove(move, pokemon); + } + + if (this.battle.activeMove) { + move.priority = this.battle.activeMove.priority; + if (!move.hasBounced) move.pranksterBoosted = this.battle.activeMove.pranksterBoosted; + } + const baseTarget = move.target; + let targetRelayVar = { target }; + targetRelayVar = this.battle.runEvent('ModifyTarget', pokemon, target, move, targetRelayVar, true); + if (targetRelayVar.target !== undefined) target = targetRelayVar.target; + if (target === undefined) target = this.battle.getRandomTarget(pokemon, move); + if (move.target === 'self' || move.target === 'allies') { + target = pokemon; + } + if (sourceEffect) { + move.sourceEffect = sourceEffect.id; + move.ignoreAbility = (sourceEffect as ActiveMove).ignoreAbility; + } + let moveResult = false; + + this.battle.setActiveMove(move, pokemon, target); + + this.battle.singleEvent('ModifyType', move, null, pokemon, target, move, move); + this.battle.singleEvent('ModifyMove', move, null, pokemon, target, move, move); + if (baseTarget !== move.target) { + // Target changed in ModifyMove, so we must adjust it here + // Adjust before the next event so the correct target is passed to the + // event + target = this.battle.getRandomTarget(pokemon, move); + } + move = this.battle.runEvent('ModifyType', pokemon, target, move, move); + move = this.battle.runEvent('ModifyMove', pokemon, target, move, move); + if (baseTarget !== move.target) { + // Adjust again + target = this.battle.getRandomTarget(pokemon, move); + } + if (!move || pokemon.fainted) { + return false; + } + + let attrs = ''; + + let movename = move.name; + if (move.id === 'hiddenpower') movename = 'Hidden Power'; + if (sourceEffect) attrs += `|[from] ${sourceEffect.fullname}`; + if (zMove && move.isZ === true) { + attrs = `|[anim]${movename}${attrs}`; + movename = `Z-${movename}`; + } + this.battle.addMove('move', pokemon, movename, `${target}${attrs}`); + + if (zMove) this.runZPower(move, pokemon); + + if (!target) { + this.battle.attrLastMove('[notarget]'); + this.battle.add(this.battle.gen >= 5 ? '-fail' : '-notarget', pokemon); + return false; + } + + const { targets, pressureTargets } = pokemon.getMoveTargets(move, target); + if (targets.length) { + target = targets[targets.length - 1]; // in case of redirection + } + + const callerMoveForPressure = sourceEffect && (sourceEffect as ActiveMove).pp ? sourceEffect as ActiveMove : null; + if (!sourceEffect || callerMoveForPressure || sourceEffect.id === 'pursuit') { + let extraPP = 0; + for (const source of pressureTargets) { + const ppDrop = this.battle.runEvent('DeductPP', source, pokemon, move); + if (ppDrop !== true) { + extraPP += ppDrop || 0; + } + } + if (extraPP > 0) { + pokemon.deductPP(callerMoveForPressure || moveOrMoveName, extraPP); + } + } + + let tryMoveResult = this.battle.singleEvent('TryMove', move, null, pokemon, target, move); + if (tryMoveResult) { + tryMoveResult = this.battle.runEvent('TryMove', pokemon, target, move); + } + if (!tryMoveResult) { + move.mindBlownRecoil = false; + return tryMoveResult; + } + + this.battle.singleEvent('UseMoveMessage', move, null, pokemon, target, move); + + if (move.ignoreImmunity === undefined) { + move.ignoreImmunity = (move.category === 'Status'); + } + + if (this.battle.gen !== 4 && move.selfdestruct === 'always') { + this.battle.faint(pokemon, pokemon, move); + } + + let damage: number | false | undefined | '' = false; + if (move.target === 'all' || move.target === 'foeSide' || move.target === 'allySide' || move.target === 'allyTeam') { + damage = this.tryMoveHit(targets, pokemon, move); + if (damage === this.battle.NOT_FAIL) pokemon.moveThisTurnResult = null; + if (damage || damage === 0 || damage === undefined) moveResult = true; + } else { + if (!targets.length) { + this.battle.attrLastMove('[notarget]'); + this.battle.add(this.battle.gen >= 5 ? '-fail' : '-notarget', pokemon); + return false; + } + if (this.battle.gen === 4 && move.selfdestruct === 'always') { + this.battle.faint(pokemon, pokemon, move); + } + moveResult = this.trySpreadMoveHit(targets, pokemon, move); + } + if (move.selfBoost && moveResult) this.moveHit(pokemon, pokemon, move, move.selfBoost, false, true); + if (!pokemon.hp) { + this.battle.faint(pokemon, pokemon, move); + } + + if (!moveResult) { + this.battle.singleEvent('MoveFail', move, null, target, pokemon, move); + return false; + } + + if (!(move.hasSheerForce && pokemon.hasAbility('sheerforce')) && !move.flags['futuremove']) { + const originalHp = pokemon.hp; + this.battle.singleEvent('AfterMoveSecondarySelf', move, null, pokemon, target, move); + this.battle.runEvent('AfterMoveSecondarySelf', pokemon, target, move); + if (pokemon && pokemon !== target && move.category !== 'Status') { + if (pokemon.hp <= pokemon.maxhp / 2 && originalHp > pokemon.maxhp / 2) { + this.battle.runEvent('EmergencyExit', pokemon, pokemon); + } + } + } + + return true; + }, + canTerastallize(pokemon: Pokemon) { + if (this.dex.gen !== 9) { + return null; + } + return pokemon.teraType; + }, + canMegaEvo(pokemon) { + const species = pokemon.baseSpecies; + const altForme = species.otherFormes && this.dex.species.get(species.otherFormes[0]); + const item = pokemon.getItem(); + // Mega Rayquaza + if ((this.battle.gen <= 7 || this.battle.ruleTable.has('+pokemontag:past') || + this.battle.ruleTable.has('+pokemontag:future')) && + altForme?.isMega && altForme?.requiredMove && + pokemon.baseMoves.includes(this.battle.toID(altForme.requiredMove)) && !item.zMove) { + return altForme.name; + } + if (species.baseSpecies === 'Magearna' && !species.isMega) { + return species.name.includes('Original') ? 'Magearna-Original-Mega' : 'Magearna-Mega'; + } + if (!item.megaStone) return null; + return item.megaStone[species.name]; + }, + modifyDamage(baseDamage, pokemon, target, move, suppressMessages = false) { + const tr = this.battle.trunc; + if (!move.type) move.type = '???'; + const type = move.type; + + baseDamage += 2; + + if (move.spreadHit) { + // multi-target modifier (doubles only) + const spreadModifier = this.battle.gameType === 'freeforall' ? 0.5 : 0.75; + this.battle.debug(`Spread modifier: ${spreadModifier}`); + baseDamage = this.battle.modify(baseDamage, spreadModifier); + } else if (move.multihitType === 'parentalbond' && move.hit > 1) { + // Parental Bond modifier + const bondModifier = this.battle.gen > 6 ? 0.25 : 0.5; + this.battle.debug(`Parental Bond modifier: ${bondModifier}`); + baseDamage = this.battle.modify(baseDamage, bondModifier); + } + + // weather modifier + baseDamage = this.battle.runEvent('WeatherModifyDamage', pokemon, target, move, baseDamage); + + // crit - not a modifier + const isCrit = target.getMoveHitData(move).crit; + if (isCrit) { + baseDamage = tr(baseDamage * (move.critModifier || (this.battle.gen >= 6 ? 1.5 : 2))); + } + + // random factor - also not a modifier + baseDamage = this.battle.randomizer(baseDamage); + + // STAB + // The "???" type never gets STAB + // Not even if you Roost in Gen 4 and somehow manage to use + // Struggle in the same turn. + // (On second thought, it might be easier to get a MissingNo.) + if (type !== '???') { + let stab: number | [number, number] = 1; + + const pokeTypes = pokemon.getTypes(false, true); + const isPrimarySTAB = move.forceSTAB || (pokemon.hasType(type) && pokeTypes[0] === type); + const isSecondarySTAB = move.forceSTAB || (pokemon.hasType(type) && pokeTypes.length > 1 && pokeTypes[1] === type); + const isSTAB = move.forceSTAB || pokemon.hasType(type) || pokemon.getTypes(false, true).includes(type); + if (isPrimarySTAB) { + stab = 1.7; + } + if (isSecondarySTAB) { + stab = 1.2; + } + + // The Stellar tera type makes this incredibly confusing + // If the move's type does not match one of the user's base types, + // the Stellar tera type applies a one-time 1.2x damage boost for that type. + // + // If the move's type does match one of the user's base types, + // then the Stellar tera type applies a one-time 2x STAB boost for that type, + // and then goes back to using the regular 1.5x STAB boost for those types. + if (pokemon.terastallized === 'Stellar') { + if (!pokemon.stellarBoostedTypes.includes(type) || move.stellarBoosted) { + stab = isSTAB ? 2.3 : [4915, 4096]; + move.stellarBoosted = true; + if (pokemon.species.name !== 'Terapagos-Stellar') { + pokemon.stellarBoostedTypes.push(type); + } + } + } else { + if (pokemon.terastallized === type && pokeTypes.includes(type)) { + stab = 2.3; + } + stab = this.battle.runEvent('ModifySTAB', pokemon, target, move, stab); + } + + baseDamage = this.battle.modify(baseDamage, stab); + } + + // types + let typeMod = target.runEffectiveness(move); + typeMod = this.battle.clampIntRange(typeMod, -6, 6); + target.getMoveHitData(move).typeMod = typeMod; + if (typeMod > 0) { + if (!suppressMessages) this.battle.add('-supereffective', target); + + for (let i = 0; i < typeMod; i++) { + baseDamage *= 2; + } + } + if (typeMod < 0) { + if (!suppressMessages) this.battle.add('-resisted', target); + + for (let i = 0; i > typeMod; i--) { + baseDamage = tr(baseDamage / 2); + } + } + + if (isCrit && !suppressMessages) this.battle.add('-crit', target); + + if (pokemon.status === 'brn' && move.category === 'Physical' && !pokemon.hasAbility('guts')) { + if (this.battle.gen < 6 || move.id !== 'facade') { + baseDamage = this.battle.modify(baseDamage, 0.5); + } + } + + if (pokemon.status === 'psn' && move.category === 'Special') { + if (this.battle.gen < 6 || move.id !== 'facade') { + baseDamage = this.battle.modify(baseDamage, 0.5); + } + } + + // Generation 5, but nothing later, sets damage to 1 before the final damage modifiers + if (this.battle.gen === 5 && !baseDamage) baseDamage = 1; + + // Final modifier. Modifiers that modify damage after min damage check, such as Life Orb. + baseDamage = this.battle.runEvent('ModifyDamage', pokemon, target, move, baseDamage); + + const bypassProtect = target.getMoveHitData(move).bypassProtect; + if (bypassProtect) { + baseDamage = this.battle.modify(baseDamage, 0.25); + if (bypassProtect !== true && bypassProtect.effectType === 'Ability') { + this.battle.add('-ability', pokemon, bypassProtect.name); + } + this.battle.add('-zbroken', target); + } + + // Generation 6-7 moves the check for minimum 1 damage after the final modifier... + if (this.battle.gen !== 5 && !baseDamage) return 1; + + // ...but 16-bit truncation happens even later, and can truncate to 0 + return tr(baseDamage, 16); + }, + getDamage(source, target, move, suppressMessages = false) { + if (typeof move === 'string') move = this.dex.getActiveMove(move); + + if (typeof move === 'number') { + const basePower = move; + move = new Dex.Move({ + basePower, + type: '???', + category: 'Physical', + willCrit: false, + }) as ActiveMove; + move.hit = 0; + } + + if (!target.runImmunity(move, !suppressMessages)) { + return false; + } + + if (move.ohko) return this.battle.gen === 3 ? target.hp : target.maxhp; + if (move.damageCallback) return move.damageCallback.call(this.battle, source, target); + if (move.damage === 'level') { + return source.level; + } else if (move.damage) { + return move.damage; + } + + let category = this.battle.getCategory(move); + + let basePower: number | false | null = move.basePower; + if (move.basePowerCallback) { + basePower = move.basePowerCallback.call(this.battle, source, target, move); + } + if (!basePower) return basePower === 0 ? undefined : basePower; + basePower = this.battle.clampIntRange(basePower, 1); + if (move.type === 'Electric' && move.category === 'Physical') { + basePower += 15; + category = 'Special'; + } + + let critMult; + let critRatio = this.battle.runEvent('ModifyCritRatio', source, target, move, move.critRatio || 0); + if (this.battle.gen <= 5) { + critRatio = this.battle.clampIntRange(critRatio, 0, 5); + critMult = [0, 16, 8, 4, 3, 2]; + } else { + critRatio = this.battle.clampIntRange(critRatio, 0, 4); + if (this.battle.gen === 6) { + critMult = [0, 16, 8, 2, 1]; + } else { + critMult = [0, 24, 8, 2, 1]; + } + } + + const moveHit = target.getMoveHitData(move); + moveHit.crit = move.willCrit || false; + if (move.willCrit === undefined) { + if (critRatio) { + moveHit.crit = this.battle.randomChance(1, critMult[critRatio]); + } + } + + if (moveHit.crit) { + moveHit.crit = this.battle.runEvent('CriticalHit', target, null, move); + } + + // happens after crit calculation + basePower = this.battle.runEvent('BasePower', source, target, move, basePower, true); + + if (!basePower) return 0; + basePower = this.battle.clampIntRange(basePower, 1); + // Hacked Max Moves have 0 base power, even if you Dynamax + if ((!source.volatiles['dynamax'] && move.isMax) || (move.isMax && this.dex.moves.get(move.baseMove).isMax)) { + basePower = 0; + } + + const dexMove = this.dex.moves.get(move.id); + if (source.terastallized && (source.terastallized === 'Stellar' ? + !source.stellarBoostedTypes.includes(move.type) : source.hasType(move.type)) && + basePower < 60 && dexMove.priority <= 0 && !dexMove.multihit && + // Hard move.basePower check for moves like Dragon Energy that have variable BP + !((move.basePower === 0 || move.basePower === 150) && move.basePowerCallback) + ) { + basePower = 60; + } + + const level = source.level; + + const attacker = move.overrideOffensivePokemon === 'target' ? target : source; + const defender = move.overrideDefensivePokemon === 'source' ? source : target; + + const isPhysical = move.category === 'Physical'; + let attackStat: StatIDExceptHP = move.overrideOffensiveStat || (isPhysical ? 'atk' : 'spa'); + const defenseStat: StatIDExceptHP = move.overrideDefensiveStat || (isPhysical ? 'def' : 'spd'); + + const statTable = { atk: 'Atk', def: 'Def', spa: 'SpA', spd: 'SpD', spe: 'Spe' }; + + let atkBoosts = attacker.boosts[attackStat]; + let defBoosts = defender.boosts[defenseStat]; + + let ignoreNegativeOffensive = !!move.ignoreNegativeOffensive; + let ignorePositiveDefensive = !!move.ignorePositiveDefensive; + + if (moveHit.crit) { + ignoreNegativeOffensive = true; + ignorePositiveDefensive = true; + } + const ignoreOffensive = !!(move.ignoreOffensive || (ignoreNegativeOffensive && atkBoosts < 0)); + const ignoreDefensive = !!(move.ignoreDefensive || (ignorePositiveDefensive && defBoosts > 0)); + + if (ignoreOffensive) { + this.battle.debug('Negating (sp)atk boost/penalty.'); + atkBoosts = 0; + } + if (ignoreDefensive) { + this.battle.debug('Negating (sp)def boost/penalty.'); + defBoosts = 0; + } + + let attack = attacker.calculateStat(attackStat, atkBoosts, 1, source); + let defense = defender.calculateStat(defenseStat, defBoosts, 1, target); + + attackStat = (category === 'Physical' ? 'atk' : 'spa'); + + // Apply Stat Modifiers + attack = this.battle.runEvent('Modify' + statTable[attackStat], source, target, move, attack); + defense = this.battle.runEvent('Modify' + statTable[defenseStat], target, source, move, defense); + + if (this.battle.gen <= 4 && ['explosion', 'selfdestruct'].includes(move.id) && defenseStat === 'def') { + defense = this.battle.clampIntRange(Math.floor(defense / 2), 1); + } + + const tr = this.battle.trunc; + + // int(int(int(2 * L / 5 + 2) * A * P / D) / 50); + const baseDamage = tr(tr(tr(tr(2 * level / 5 + 2) * basePower * attack) / defense) / 50); + + // Calculate damage modifiers separately (order differs between generations) + return this.modifyDamage(baseDamage, source, target, move, suppressMessages); + }, + }, +}; diff --git a/data/mods/afd/sets.json b/data/mods/afd/sets.json new file mode 100644 index 0000000000..8e440de574 --- /dev/null +++ b/data/mods/afd/sets.json @@ -0,0 +1,1052 @@ +{ + "clefablemega": { + "level": 82, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Dazzling Gleam", "Flamethrower", "Moonlight", "Stealth Rock", "Thunder Wave"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost"] + } + ] + }, + "victreebelmega": { + "level": 86, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Knock Off", "Power Whip", "Sludge Bomb", "Strength Sap"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost"] + } + ] + }, + "starmiemega": { + "level": 78, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Aqua Jet", "Bulk Up", "Triple Axel", "Waterfall", "Zen Headbutt"], + "abilities": ["Huge Power"], + "teraTypes": ["Ghost"] + }, + { + "role": "Bulky Support", + "movepool": ["Flip Turn", "Rapid Spin", "Recover", "Zen Headbutt"], + "abilities": ["Huge Power"], + "teraTypes": ["Ghost"] + } + ] + }, + "dragonitemega": { + "level": 74, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Air Slash", "Draco Meteor", "Fire Blast", "Hurricane", "Iron Head", "Roost"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost"] + } + ] + }, + "meganiummega": { + "level": 74, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Encore", "Solar Beam", "Synthesis", "Weather Ball"], + "abilities": ["Mega Sol"], + "teraTypes": ["Fire", "Ghost"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Encore", "Solar Beam", "Synthesis", "Solar Flare"], + "abilities": ["Mega Sol"], + "teraTypes": ["Fire", "Ghost"] + } + ] + }, + "feraligatrmega": { + "level": 75, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Body Slam", "Double-Edge", "Dragon Dance", "Earthquake", "Liquidation"], + "abilities": ["Dragonize"], + "teraTypes": ["Dragon", "Ghost"] + } + ] + }, + "emboarmega": { + "level": 80, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Bulk Up", "Drain Punch", "Flare Blitz", "Trailblaze"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost"] + } + ] + }, + "skarmorymega": { + "level": 75, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Brave Bird", "Drill Run", "Roost", "Swords Dance"], + "abilities": ["Huge Power"], + "teraTypes": ["Ground"] + } + ] + }, + "froslassmega": { + "level": 75, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Aurora Veil", "Blizzard", "Nasty Plot", "Shadow Ball"], + "abilities": ["Snow Warning"], + "teraTypes": ["Fairy"] + } + ] + }, + "excadrillmega": { + "level": 80, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Iron Head", "Rock Slide", "Sandstorm", "Thousand Arrows"], + "abilities": ["It's Excadrillin' Time!"], + "teraTypes": ["Ghost"] + } + ] + }, + "scolipedemega": { + "level": 75, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Megahorn", "Poison Jab", "Protect", "Swords Dance"], + "abilities": ["Huge Power"], + "teraTypes": ["Ghost"] + } + ] + }, + "scraftymega": { + "level": 75, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Dragon Dance", "Drain Punch", "Knock Off", "Poison Jab"], + "abilities": ["Huge Power"], + "teraTypes": ["Ghost"] + } + ] + }, + "eelektrossmega": { + "level": 80, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Flamethrower", "Giga Drain", "Volt Switch", "Wild Charge"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost"] + } + ] + }, + "chandeluremega": { + "level": 75, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Calm Mind", "Fire Blast", "Flame Charge", "Shadow Ball"], + "abilities": ["Shadow Tag"], + "teraTypes": ["Fairy", "Ghost", "Grass"] + } + ] + }, + "chesnaughtmega": { + "level": 80, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Body Press", "Iron Defense", "Synthesis", "Wood Hammer"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost"] + } + ] + }, + "delphoxmega": { + "level": 80, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Fire Blast", "Grass Knot", "Nasty Plot", "Psyshock"], + "abilities": ["Discourage"], + "teraTypes": ["Ghost"] + } + ] + }, + "greninjamega": { + "level": 80, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Dark Pulse", "Gunk Shot", "Hydro Pump", "Ice Beam"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost", "Poison"] + } + ] + }, + "pyroarmega": { + "level": 80, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Dark Pulse", "Fire Blast", "Hyper Voice", "Will-O-Wisp"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost"] + } + ] + }, + "floettemega": { + "level": 88, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Calm Mind", "Dazzling Gleam", "Protect", "Wish"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost"] + } + ] + }, + "malamarmega": { + "level": 80, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Knock Off", "Rest", "Sleep Talk", "Superpower"], + "abilities": ["Contrary"], + "teraTypes": ["Fighting", "Ghost"] + } + ] + }, + "barbaraclemega": { + "level": 78, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Cross Chop", "Earthquake", "Liquidation", "Shell Smash", "Stone Edge"], + "abilities": ["Huge Power"], + "teraTypes": ["Fighting", "Ghost"] + } + ] + }, + "dragalgemega": { + "level": 84, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Draco Meteor", "Flip Turn", "Sludge Wave", "Toxic", "Toxic Spikes"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost"] + } + ] + }, + "hawluchamega": { + "level": 75, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Brave Bird", "Drain Punch", "Swords Dance", "Throat Chop"], + "abilities": ["Huge Power"], + "teraTypes": ["Fighting", "Ghost"] + } + ] + }, + "zygardemega": { + "level": 72, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Core Enforcer", "Earth Power", "Glare", "Sludge Wave"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost", "Poison"] + } + ] + }, + "drampamega": { + "level": 80, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Defog", "Draco Meteor", "Fire Blast", "Glare", "Hyper Voice", "Roost"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost"] + } + ] + }, + "falinksmega": { + "level": 80, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Body Slam", "Close Combat", "Knock Off", "Swords Dance"], + "abilities": ["No Retreat"], + "teraTypes": ["Ghost"] + } + ] + }, + "raichumegax": { + "level": 82, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Body Slam", "Encore", "Knock Off", "Nuzzle", "Play Rough", "Volt Switch", "Volt Tackle"], + "abilities": ["Huge Power"], + "teraTypes": ["Dark", "Fairy", "Normal"] + } + ] + }, + "raichumegay": { + "level": 80, + "sets": [ + { + "role": "AV Pivot", + "movepool": ["Encore", "Grass Knot", "Nuzzle", "Surf", "Volt Switch", "Volt Tackle"], + "abilities": ["Regenerator"], + "teraTypes": ["Grass", "Water"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Alluring Voice", "Encore", "Grass Knot", "Nasty Plot", "Surf", "Volt Tackle"], + "abilities": ["Regenerator"], + "teraTypes": ["Grass", "Water"] + } + ] + }, + "chimechomega": { + "level": 86, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Cosmic Power", "Dazzling Gleam", "Recover", "Stored Power"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost"] + } + ] + }, + "baxcaliburmega": { + "level": 75, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Dragon Dance", "Earthquake", "Glaive Rush", "Icicle Crash"], + "abilities": ["Huge Power"], + "teraTypes": ["Ghost"] + } + ] + }, + "zeraoramega": { + "level": 75, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Bulk Up", "Drain Punch", "Knock Off", "Plasma Fists"], + "abilities": ["Huge Power"], + "teraTypes": ["Fighting", "Ghost"] + } + ] + }, + "absolmegaz": { + "level": 75, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Double-Edge", "Play Rough", "Sucker Punch", "Swords Dance"], + "abilities": ["Huge Power"], + "teraTypes": ["Ghost"] + } + ] + }, + "lucariomegaz": { + "level": 80, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Aura Sphere", "Dark Pulse", "Flash Cannon", "Nasty Plot"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost"] + } + ] + }, + "garchompmegaz": { + "level": 75, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Double-Edge", "Outrage", "Swords Dance", "Thousand Arrows"], + "abilities": ["Huge Power"], + "teraTypes": ["Ghost"] + }, + { + "role": "Fast Attacker", + "movepool": ["Draco Meteor", "Fire Blast", "Stealth Rock", "Thousand Arrows"], + "abilities": ["Huge Power"], + "teraTypes": ["Ghost"] + } + ] + }, + "golurkmega": { + "level": 75, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Ice Punch", "Poltergeist", "Stealth Rock", "Thousand Arrows"], + "abilities": ["Huge Power"], + "teraTypes": ["Steel"] + } + ] + }, + "crabominablemega": { + "level": 80, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Drain Punch", "Earthquake", "Ice Hammer"], + "abilities": ["Huge Power"], + "teraTypes": ["Ghost"] + } + ] + }, + "meowsticfmega": { + "level": 80, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Alluring Voice", "Nasty Plot", "Psychic", "Psyshock", "Shadow Ball"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost"] + } + ] + }, + "golisopodmega": { + "level": 75, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Close Combat", "First Impression", "Iron Head", "Pain Split", "Spikes"], + "abilities": ["Huge Power"], + "teraTypes": ["Ghost"] + }, + { + "role": "Bulky Setup", + "movepool": ["Belly Drum", "Close Combat", "Iron Head", "Leech Life"], + "abilities": ["Huge Power"], + "teraTypes": ["Ghost"] + } + ] + }, + "staraptormega": { + "level": 75, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Brave Bird", "Close Combat", "Thief", "U-turn"], + "abilities": ["Huge Power"], + "teraTypes": ["Ghost"] + } + ] + }, + "tatsugiricurlymega": { + "level": 80, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Dragon Pulse", "Hydro Pump", "Nasty Plot", "Rapid Spin"], + "abilities": ["Parental Bond"], + "teraTypes": ["Ghost"] + } + ] + }, + "glimmoramega": { + "level": 75, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Earth Power", "Meteor Beam", "Sandstorm", "Sludge Wave"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost"] + } + ] + }, + "magearnamega": { + "level": 72, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Aura Sphere", "Flash Cannon", "Fleur Cannon", "Agility"], + "abilities": ["Soul-Heart"], + "teraTypes": ["Ghost"] + } + ] + }, + "heatranmega": { + "level": 78, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Earth Power", "Heavy Slam", "Lava Plume", "Magma Storm", "Stealth Rock"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost"] + } + ] + }, + "darkraimega": { + "level": 78, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Calm Mind", "Dark Pulse", "Sludge Bomb", "Will-O-Wisp"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost"] + } + ] + }, + "scovillainmega": { + "level": 86, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Giga Drain", "Leaf Storm", "Leech Seed", "Overheat"], + "abilities": ["Contrary"], + "teraTypes": ["Ghost"] + } + ] + }, + "noivern": { + "level": 82, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Boomburst", "Draco Meteor", "Flamethrower", "Hurricane", "U-turn"], + "abilities": ["Regenerator"], + "teraTypes": ["Normal"] + }, + { + "role": "Fast Support", + "movepool": ["Defog", "Draco Meteor", "Boomburst", "Roost"], + "abilities": ["Regenerator"], + "teraTypes": ["Normal"] + } + ] + }, + "kingambit": { + "level": 74, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Iron Head", "Low Kick", "Sucker Punch", "Swords Dance"], + "abilities": ["Supreme Overlord"], + "teraTypes": ["Ghost"] + } + ] + }, + "tatsugiri": { + "level": 84, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Dragon Pulse", "Hydro Pump", "Nasty Plot", "Rapid Spin"], + "abilities": ["Parental Bond"], + "teraTypes": ["Ghost"] + } + ] + }, + "lickilicky": { + "level": 89, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Body Slam", "Knock Off", "Protect", "Wish"], + "abilities": ["Chaos Saliva"], + "teraTypes": ["Ghost"] + }, + { + "role": "AV Pivot", + "movepool": ["Body Slam", "Dragon Tail", "Earthquake", "Explosion", "Knock Off", "Power Whip"], + "abilities": ["Chaos Saliva"], + "teraTypes": ["Ghost"] + }, + { + "role": "Bulky Setup", + "movepool": ["Body Slam", "Earthquake", "Explosion", "Knock Off", "Power Whip", "Swords Dance"], + "abilities": ["Chaos Saliva"], + "teraTypes": ["Ghost"] + } + ] + }, + "skuntank": { + "level": 85, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Dark Pulse", "Fire Blast", "Nasty Plot", "Shit Pulse"], + "abilities": ["Mega Launcher"], + "teraTypes": ["Ghost"] + } + ] + }, + "hatterene": { + "level": 85, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Calm Mind", "Dark Pulse", "Draining Kiss", "Psyshock"], + "abilities": ["Magic Bounce"], + "teraTypes": ["Fairy"] + }, + { + "role": "AV Pivot", + "movepool": ["Nuzzle", "Dark Pulse", "Draining Kiss", "Psyshock"], + "abilities": ["Magic Bounce", "Regenerator"], + "teraTypes": ["Fairy"] + } + ] + }, + "clawitzer": { + "level": 80, + "sets": [ + { + "role": "AV Pivot", + "movepool": ["Aura Sphere", "Dark Pulse", "Dragon Pulse", "Water Pulse"], + "abilities": ["Super Mega Launcher"], + "teraTypes": ["Dragon"] + } + ] + }, + "conkeldurr": { + "level": 80, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Drain Punch", "Ice Punch", "Mach Punch"], + "abilities": ["Iron Fist"], + "teraTypes": ["Ghost", "Steel"] + } + ] + }, + "hitmonchan": { + "level": 80, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Drain Punch", "Ice Punch", "Mach Punch", "Mega Punch"], + "abilities": ["Iron Fist"], + "teraTypes": ["Ghost", "Steel"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Drain Punch", "Ice Punch", "Mach Punch", "Swords Dance"], + "abilities": ["Iron Fist"], + "teraTypes": ["Ghost", "Steel"] + } + ] + }, + "smeargle": { + "level": 90, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Spore", "Sticky Web", "Stealth Rock", "Topsy-Turvy"], + "abilities": ["Prankster"], + "teraTypes": ["Ghost"] + } + ] + }, + "hippowdon": { + "level": 80, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Roar", "Slack Off", "Stealth Rock", "Thousand Arrows"], + "abilities": ["Sand Stream"], + "teraTypes": ["Ghost", "Steel"] + } + ] + }, + "tinglu": { + "level": 80, + "sets": [ + { + "role": "Fast Support", + "movepool": ["Spikes", "Stealth Rock", "Thousand Arrows", "Whirlwind"], + "abilities": ["Vessel of Ruin"], + "teraTypes": ["Ghost", "Steel"] + } + ] + }, + "spidops": { + "level": 86, + "sets": [ + { + "role": "AV Pivot", + "movepool": ["Circle Throw", "First Impression", "Sucker Punch", "U-turn"], + "abilities": ["Regenerator", "Stakeout"], + "teraTypes": ["Ghost"] + }, + { + "role": "Bulky Support", + "movepool": ["Circle Throw", "First Impression", "Sticky Web", "Sucker Punch", "U-turn"], + "abilities": ["Regenerator", "Stakeout"], + "teraTypes": ["Ghost"] + } + ] + }, + "regidrago": { + "level": 75, + "sets": [ + { + "role": "AV Pivot", + "movepool": ["Dragon Dance", "Earthquake", "Explosion", "Outrage"], + "abilities": ["Dragon's Maw"], + "teraTypes": ["Normal"] + }, + { + "role": "Fast Attacker", + "movepool": ["Draco Meteor", "Dragon Energy", "Earthquake", "Explosion"], + "abilities": ["Dragon's Maw"], + "teraTypes": ["Dragon", "Normal"] + } + ] + }, + "minior": { + "level": 75, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Acrobatics", "Earthquake", "Explosion", "Shell Smash"], + "abilities": ["Regenerator"], + "teraTypes": ["Normal"] + } + ] + }, + "calyrexmonarch": { + "level": 80, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Body Press", "Dark Void", "Leaf Storm", "Photon Geyser"], + "abilities": ["Regenerator"], + "teraTypes": ["Fighting"] + } + ] + }, + "celesteela": { + "level": 100, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Explosion", "Leech Seed", "Metal Sound", "Stealth Rock"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost"] + } + ] + }, + "dusknoir": { + "level": 100, + "sets": [ + { + "role": "AV Pivot", + "movepool": ["Explosion"], + "abilities": ["Damp"], + "teraTypes": ["Dark"] + } + ] + }, + "regigigas": { + "level": 65, + "sets": [ + { + "role": "AV Pivot", + "movepool": ["Body Slam", "Crush Grip", "Drain Punch", "Knock Off"], + "abilities": ["Fast Start"], + "teraTypes": ["Ghost"] + } + ] + }, + "incineroar2": { + "level": 80, + "sets": [ + { + "role": "AV Pivot", + "movepool": ["Close Combat", "Gigaton Hammer", "Poltergeist", "Shadow Sneak", "U-turn"], + "abilities": ["Intimidate 2"], + "teraTypes": ["Ghost"] + }, + { + "role": "Fast Attacker", + "movepool": ["Close Combat", "Gigaton Hammer", "King's Shield", "Poltergeist"], + "abilities": ["Intimidate 2"], + "teraTypes": ["Fighting"] + }, + { + "role": "Fast Attacker", + "movepool": ["Gigaton Hammer", "King's Shield", "Poltergeist", "Shadow Sneak"], + "abilities": ["Intimidate 2"], + "teraTypes": ["Ghost"] + } + ] + }, + "incineroar": { + "level": 88, + "sets": [ + { + "role": "AV Pivot", + "movepool": ["Close Combat", "Fake Out", "Flare Blitz", "U-turn"], + "abilities": ["Intimidate"], + "teraTypes": ["Ghost"] + } + ] + }, + "bibarel": { + "level": 75, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Body Slam", "Power Trip", "Stored Power", "Work Up"], + "abilities": ["Simple"], + "teraTypes": ["Ghost"] + }, + { + "role": "Bulky Setup", + "movepool": ["Belly Drum", "Body Slam", "Power Trip", "Waterfall"], + "abilities": ["Unaware"], + "teraTypes": ["Dark", "Ghost"] + } + ] + }, + "tapufini": { + "level": 85, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Dazzling Gleam", "Misty Explosion", "Surf"], + "abilities": ["Misty Surge"], + "teraTypes": ["Ghost"] + }, + { + "role": "Bulky Setup", + "movepool": ["Belly Drum", "Body Slam", "Power Trip", "Waterfall"], + "abilities": ["Unaware"], + "teraTypes": ["Ghost"] + } + ] + }, + "swampert": { + "level": 87, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Ice Punch", "Liquidation", "Thousand Arrows"], + "abilities": ["Sap Sipper"], + "teraTypes": ["Ghost"] + }, + { + "role": "Bulky Setup", + "movepool": ["Flip Turn", "Knock Off", "Stealth Rock", "Thousand Arrows"], + "abilities": ["Sap Sipper"], + "teraTypes": ["Ghost"] + } + ] + }, + "serperior": { + "level": 77, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Draco Meteor", "Leaf Storm", "Overheat", "Synthesis"], + "abilities": ["Contrary"], + "teraTypes": ["Dragon", "Fire", "Ghost"] + } + ] + }, + "rampardos": { + "level": 90, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Accelerock", "Earthquake", "Head Smash", "Stone Edge"], + "abilities": ["Rocky Payload"], + "teraTypes": ["Rock"] + } + ] + }, + "simisage": { + "level": 80, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Gunk Shot", "Leaf Storm", "Superpower", "Synthesis"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost", "Poison"] + } + ] + }, + "bruxish": { + "level": 75, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Crunch", "Fishious Rend", "Flip Turn", "Psychic Fangs"], + "abilities": ["Strong Jaw"], + "teraTypes": ["Water"] + } + ] + }, + "mewtwo": { + "level": 72, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Aura Sphere", "Dark Pulse", "Fire Blast", "Nasty Plot", "Psystrike", "Recover"], + "abilities": ["Neuroforce"], + "teraTypes": ["Dark", "Fighting", "Fire", "Psychic"] + } + ] + }, + "mew": { + "level": 82, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Encore", "Knock Off", "Psychic", "Psychic Noise", "Stealth Rock", "Toxic Spikes", "U-turn", "Will-O-Wisp"], + "abilities": ["Regenerator"], + "teraTypes": ["Dark", "Fairy", "Steel"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Close Combat", "Knock Off", "Leech Life", "Psychic Fangs", "Swords Dance"], + "abilities": ["Neuroforce"], + "teraTypes": ["Fighting"] + }, + { + "role": "Fast Bulky Setup", + "movepool": ["Aura Sphere", "Bug Buzz", "Dark Pulse", "Earth Power", "Fire Blast", "Hydro Pump", "Nasty Plot", "Psychic", "Psyshock"], + "abilities": ["Neuroforce"], + "teraTypes": ["Dark", "Fighting", "Fire", "Ground", "Psychic", "Water"] + } + ] + }, + "honchkrow": { + "level": 86, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Brave Bird", "Heat Wave", "Sucker Punch", "U-turn"], + "abilities": ["Moxie", "Regenerator"], + "teraTypes": ["Ghost"] + } + ] + }, + "cacturne": { + "level": 92, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Knock Off", "Leaf Storm", "Spikes", "Sucker Punch", "Toxic Spikes"], + "abilities": ["Regenerator", "Water Absorb"], + "teraTypes": ["Ghost"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Drain Punch", "Seed Bomb", "Sucker Punch", "Swords Dance"], + "abilities": ["Water Absorb"], + "teraTypes": ["Ghost"] + } + ] + }, + "brutebonnet": { + "level": 81, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Close Combat", "Seed Bomb", "Spore", "Sucker Punch"], + "abilities": ["Protosynthesis"], + "teraTypes": ["Fighting", "Ghost"] + } + ] + }, + "ampharosmega": { + "level": 85, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Dragon Pulse", "Tail Glow", "Thunderbolt", "Trailblaze"], + "abilities": ["Regenerator"], + "teraTypes": ["Electric", "Ghost"] + } + ] + }, + "gallademega": { + "level": 80, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Night Slash", "Psycho Cut", "Sacred Sword", "Swords Dance"], + "abilities": ["Sharpness"], + "teraTypes": ["Dark", "Fighting", "Ghost"] + } + ] + }, + "infernape": { + "level": 80, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Drain Punch", "Fire Punch", "Mach Punch", "Swords Dance"], + "abilities": ["Iron Fist"], + "teraTypes": ["Ghost", "Fighting"] + } + ] + }, + "tyranitar": { + "level": 78, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Dark Pulse", "Fire Blast", "Hydro Pump", "Ice Beam", "Meteor Beam", "Shore Up", "Thunder Wave"], + "abilities": ["Sand Stream"], + "teraTypes": ["Ghost"] + } + ] + }, + "bastiodon": { + "level": 89, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["Blastiodon", "Body Press", "Foul Play", "Iron Defense"], + "abilities": ["Regenerator"], + "teraTypes": ["Ghost"] + } + ] + }, + "seaking": { + "level": 82, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Bolt Beak", "Fishious Rend", "Flip Turn", "Megahorn"], + "abilities": ["Lightning Rod", "Regenerator"], + "teraTypes": ["Electric"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Agility", "Bolt Beak", "Fishious Rend", "Megahorn"], + "abilities": ["Lightning Rod"], + "teraTypes": ["Electric"] + } + ] + } +} diff --git a/data/mods/afd/typechart.ts b/data/mods/afd/typechart.ts new file mode 100644 index 0000000000..8b505aad04 --- /dev/null +++ b/data/mods/afd/typechart.ts @@ -0,0 +1,49 @@ +export const TypeChart: import('../../../sim/dex-data').ModdedTypeDataTable = { + fairy: { + 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: 1, + Poison: 1, + Psychic: 0, + Rock: 0, + Steel: 1, + Stellar: 0, + Water: 0, + }, + }, + ghost: { + inherit: true, + damageTaken: { + Bug: 3, + Dark: 1, + Dragon: 1, + Electric: 1, + Fairy: 3, + Fighting: 3, + Fire: 1, + Flying: 3, + Ghost: 3, + Grass: 1, + Ground: 3, + Ice: 1, + Normal: 3, + Poison: 3, + Psychic: 1, + Rock: 3, + Steel: 3, + Stellar: 0, + Water: 1, + }, + }, +}; diff --git a/data/mods/biomechmons/abilities.ts b/data/mods/biomechmons/abilities.ts index 62b6ffd416..832ffc2bae 100644 --- a/data/mods/biomechmons/abilities.ts +++ b/data/mods/biomechmons/abilities.ts @@ -185,17 +185,20 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa (pokemon.m.scrambled.abilities as { thing: string, inSlot: string }[]).findIndex(e => this.toID(e.thing) === 'trace' && e.inSlot === 'Move'), 1); this.add('-ability', pokemon, move.name, 'Trace'); + const ppUps = move.noPPBoosts ? 0 : 3; + const basePP = this.calculatePP(move, ppUps); 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, + pp: basePP, + maxpp: basePP, target: move.target, disabled: false, used: false, }; pokemon.baseMoveSlots.push(newMove); pokemon.moveSlots.push(newMove); + pokemon.ppUps.push(ppUps); } } return; diff --git a/data/mods/biomechmons/moves.ts b/data/mods/biomechmons/moves.ts index a2b6665cda..c1348b090b 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(); @@ -280,17 +298,20 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } else { source.m.scrambled.moves.push({ thing: targetAbility.id, inSlot: 'Ability' }); const bmmMove = Dex.moves.get(targetAbility.id); + const ppUps = move.noPPBoosts ? 0 : 3; + const basePP = this.calculatePP(move, ppUps); const newMove = { move: bmmMove.name, id: bmmMove.id, - pp: bmmMove.noPPBoosts ? bmmMove.pp : bmmMove.pp * 8 / 5, - maxpp: bmmMove.noPPBoosts ? bmmMove.pp : bmmMove.pp * 8 / 5, + pp: basePP, + maxpp: basePP, target: bmmMove.target, disabled: false, used: false, }; source.baseMoveSlots.push(newMove); source.moveSlots.push(newMove); + source.ppUps.push(ppUps); } } this.singleEvent('Start', sourceAbility, target.abilityState, target); @@ -303,17 +324,20 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } else { target.m.scrambled.moves.push({ thing: sourceAbility.id, inSlot: 'Ability' }); const bmmMove = Dex.moves.get(sourceAbility.id); + const ppUps = move.noPPBoosts ? 0 : 3; + const basePP = this.calculatePP(move, ppUps); const newMove = { move: bmmMove.name, id: bmmMove.id, - pp: bmmMove.noPPBoosts ? bmmMove.pp : bmmMove.pp * 8 / 5, - maxpp: bmmMove.noPPBoosts ? bmmMove.pp : bmmMove.pp * 8 / 5, + pp: basePP, + maxpp: basePP, target: bmmMove.target, disabled: false, used: false, }; target.baseMoveSlots.push(newMove); target.moveSlots.push(newMove); + target.ppUps.push(ppUps); } } }, diff --git a/data/mods/biomechmons/scripts.ts b/data/mods/biomechmons/scripts.ts index 34920e4fac..011f507547 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; } @@ -153,11 +167,13 @@ export const Scripts: ModdedBattleScriptsData = { } else { this.m.scrambled.moves.push({ thing: ability.id, inSlot: 'Ability' }); const move = Dex.moves.get(ability.id); + const ppUps = move.noPPBoosts ? 0 : 3; + const basePP = this.battle.calculatePP(move, ppUps); 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, + pp: basePP, + maxpp: basePP, target: move.target, disabled: false, used: false, @@ -165,6 +181,7 @@ export const Scripts: ModdedBattleScriptsData = { if (!isTransform) { this.baseMoveSlots.push(newMove); this.moveSlots.push(newMove); + this.ppUps.push(ppUps); } } } @@ -195,14 +212,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 +250,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 +281,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); @@ -288,17 +325,20 @@ export const Scripts: ModdedBattleScriptsData = { } else { this.m.scrambled.moves.push({ thing: item.id, inSlot: 'Item' }); const move = Dex.moves.get(item.id); + const ppUps = move.noPPBoosts ? 0 : 3; + const basePP = this.battle.calculatePP(move, ppUps); 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, + pp: basePP, + maxpp: basePP, target: move.target, disabled: false, used: false, }; this.baseMoveSlots.push(newMove); this.moveSlots.push(newMove); + this.ppUps.push(ppUps); } } return true; @@ -340,9 +380,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 +433,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; @@ -445,16 +489,17 @@ export const Scripts: ModdedBattleScriptsData = { this.hpType = (this.battle.gen >= 5 ? this.hpType : pokemon.hpType); this.hpPower = (this.battle.gen >= 5 ? this.hpPower : pokemon.hpPower); this.timesAttacked = pokemon.timesAttacked; - for (const moveSlot of pokemon.moveSlots) { + for (const [i, moveSlot] of pokemon.moveSlots.entries()) { let moveName = moveSlot.move; if (moveSlot.id === 'hiddenpower') { moveName = 'Hidden Power ' + this.hpType; } + const move = this.battle.dex.moves.get(moveSlot.id); this.moveSlots.push({ move: moveName, id: moveSlot.id, - pp: moveSlot.maxpp === 1 ? 1 : 5, - maxpp: this.battle.gen >= 5 ? (moveSlot.maxpp === 1 ? 1 : 5) : moveSlot.maxpp, + pp: Math.min(5, move.pp), + maxpp: this.battle.gen >= 5 ? Math.min(5, move.pp) : moveSlot.maxpp, target: moveSlot.target, disabled: false, used: false, diff --git a/data/mods/champions/abilities.ts b/data/mods/champions/abilities.ts new file mode 100644 index 0000000000..fe05f009d3 --- /dev/null +++ b/data/mods/champions/abilities.ts @@ -0,0 +1,66 @@ +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { + angershell: { + inherit: true, + onDamage(damage, target, source, effect) { + this.effectState.checkedAngerShell = !(effect.effectType === "Move" && !effect.multihit); + }, + }, + berserk: { + inherit: true, + onDamage(damage, target, source, effect) { + this.effectState.checkedBerserk = !(effect.effectType === "Move" && !effect.multihit); + }, + }, + dragonize: { + inherit: true, + isNonstandard: null, + }, + healer: { + inherit: true, + onResidual(pokemon) { + for (const allyActive of pokemon.adjacentAllies()) { + if (allyActive.status && this.randomChance(1, 2)) { + this.add('-activate', pokemon, 'ability: Healer'); + allyActive.cureStatus(); + } + } + }, + desc: "50% chance this Pokemon's ally has its non-volatile status condition cured at the end of each turn.", + shortDesc: "50% chance this Pokemon's ally has its status cured at the end of each turn.", + }, + megasol: { + inherit: true, + isNonstandard: null, + }, + piercingdrill: { + inherit: true, + isNonstandard: null, + }, + shedskin: { + inherit: true, + onResidual(pokemon) { + if (pokemon.hp && pokemon.status && this.randomChance(3, 10)) { + this.debug('shed skin'); + this.add('-activate', pokemon, 'ability: Shed Skin'); + pokemon.cureStatus(); + } + }, + desc: "This Pokemon has a 30% chance to have its non-volatile status condition cured at the end of each turn.", + shortDesc: "This Pokemon has a 30% chance to have its status cured at the end of each turn.", + }, + spicyspray: { + inherit: true, + isNonstandard: null, + }, + unseenfist: { + onModifyMove: undefined, // no inherit + onHitProtect(source, target, move) { + if (move.flags['contact']) { + target.getMoveHitData(move).bypassProtect = this.effect; + return false; + } + }, + inherit: true, + shortDesc: "This Pokemon's contact moves ignore a target's protection and deal 1/4 the usual damage.", + }, +}; diff --git a/data/mods/champions/conditions.ts b/data/mods/champions/conditions.ts new file mode 100644 index 0000000000..d85f458394 --- /dev/null +++ b/data/mods/champions/conditions.ts @@ -0,0 +1,136 @@ +export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = { + par: { + inherit: true, + onBeforeMove(pokemon) { + if (this.randomChance(1, 8)) { + this.add('cant', pokemon, 'par'); + return false; + } + }, + }, + slp: { + inherit: true, + 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 chance for a Pokemon to wake up on turn 2 + this.effectState.startTime = this.sample([2, 3, 3]); + this.effectState.time = this.effectState.startTime; + + if (target.removeVolatile('nightmare')) { + this.add('-end', target, 'Nightmare', '[silent]'); + } + }, + }, + frz: { + inherit: true, + 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'); + } + if (target.species.name === 'Shaymin-Sky' && target.baseSpecies.baseSpecies === 'Shaymin') { + target.formeChange('Shaymin', this.effect, true); + } + + this.effectState.startTime = 3; + this.effectState.time = this.effectState.startTime; + }, + onBeforeMove(pokemon, target, move) { + if (move.flags['defrost'] && !(move.id === 'burnup' && !pokemon.hasType('Fire'))) return; + pokemon.statusState.time--; + if (pokemon.statusState.time <= 0 || this.randomChance(1, 4)) { + pokemon.cureStatus(); + return; + } + this.add('cant', pokemon, 'frz'); + return false; + }, + }, + + raindance: { + inherit: true, + onWeatherModifyDamage(damage, attacker, defender, move) { + if (attacker.effectiveWeather() !== 'raindance') return; + if (move.type === 'Water') { + this.debug('rain water boost'); + return this.chainModify(1.5); + } + if (move.type === 'Fire') { + this.debug('rain fire suppress'); + return this.chainModify(0.5); + } + }, + }, + primordialsea: { + inherit: true, + onWeatherModifyDamage(damage, attacker, defender, move) { + if (attacker.effectiveWeather() !== 'primordialsea') return; + if (move.type === 'Water') { + this.debug('Rain water boost'); + return this.chainModify(1.5); + } + }, + }, + sunnyday: { + inherit: true, + onWeatherModifyDamage(damage, attacker, defender, move) { + if (attacker.effectiveWeather() !== 'sunnyday') return; + if (move.id === 'hydrosteam') { + this.debug('Sunny Day Hydro Steam boost'); + return this.chainModify(1.5); + } + if (move.type === 'Fire') { + this.debug('Sunny Day fire boost'); + return this.chainModify(1.5); + } + if (move.type === 'Water') { + this.debug('Sunny Day water suppress'); + return this.chainModify(0.5); + } + }, + }, + desolateland: { + inherit: true, + onWeatherModifyDamage(damage, attacker, defender, move) { + if (attacker.effectiveWeather() !== 'desolateland') return; + if (move.type === 'Fire') { + this.debug('Desolate Land fire boost'); + return this.chainModify(1.5); + } + }, + }, + sandstorm: { + inherit: true, + onModifySpD(spd, target, source) { + if (target.hasType('Rock') && source.effectiveWeather() === 'sandstorm') { + return this.modify(spd, 1.5); + } + }, + }, + snowscape: { + inherit: true, + onModifyDef(def, target, source) { + if (target.hasType('Ice') && source.effectiveWeather() === 'snowscape') { + return this.modify(def, 1.5); + } + }, + }, + // TODO: check Mega Sol's interaction with Deltastream + // deltastream: { + // inherit: true, + // onEffectiveness(typeMod, target, type, move) { + // if (move && move.effectType === 'Move' && move.category !== 'Status' && type === 'Flying' && typeMod > 0) { + // this.add('-fieldactivate', 'Delta Stream'); + // return 0; + // } + // }, + // }, +}; diff --git a/data/mods/champions/formats-data.ts b/data/mods/champions/formats-data.ts new file mode 100644 index 0000000000..b94817cdd0 --- /dev/null +++ b/data/mods/champions/formats-data.ts @@ -0,0 +1,5039 @@ +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { + bulbasaur: { + isNonstandard: "Past", + tier: "Illegal", + }, + ivysaur: { + isNonstandard: "Past", + tier: "Illegal", + }, + venusaur: { + tier: "OU", + }, + venusaurmega: { + tier: "OU", + }, + venusaurgmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + charmander: { + isNonstandard: "Past", + tier: "Illegal", + }, + charmeleon: { + isNonstandard: "Past", + tier: "Illegal", + }, + charizard: { + tier: "OU", + }, + charizardmegax: { + tier: "OU", + }, + charizardmegay: { + tier: "OU", + }, + charizardgmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + squirtle: { + isNonstandard: "Past", + tier: "Illegal", + }, + wartortle: { + isNonstandard: "Past", + tier: "Illegal", + }, + blastoise: { + tier: "OU", + }, + blastoisemega: { + tier: "OU", + }, + blastoisegmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + caterpie: { + isNonstandard: "Past", + tier: "Illegal", + }, + metapod: { + isNonstandard: "Past", + tier: "Illegal", + }, + butterfree: { + isNonstandard: "Past", + tier: "Illegal", + }, + butterfreegmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + weedle: { + isNonstandard: "Past", + tier: "Illegal", + }, + kakuna: { + isNonstandard: "Past", + tier: "Illegal", + }, + beedrill: { + tier: "OU", + }, + beedrillmega: { + tier: "OU", + }, + pidgey: { + isNonstandard: "Past", + tier: "Illegal", + }, + pidgeotto: { + isNonstandard: "Past", + tier: "Illegal", + }, + pidgeot: { + tier: "OU", + }, + pidgeotmega: { + tier: "OU", + }, + rattata: { + isNonstandard: "Past", + tier: "Illegal", + }, + rattataalola: { + isNonstandard: "Past", + tier: "Illegal", + }, + raticate: { + isNonstandard: "Past", + tier: "Illegal", + }, + raticatealola: { + isNonstandard: "Past", + tier: "Illegal", + }, + raticatealolatotem: { + isNonstandard: "Past", + tier: "Illegal", + }, + spearow: { + isNonstandard: "Past", + tier: "Illegal", + }, + fearow: { + isNonstandard: "Past", + tier: "Illegal", + }, + ekans: { + isNonstandard: "Past", + tier: "Illegal", + }, + arbok: { + tier: "OU", + }, + pichu: { + isNonstandard: "Past", + tier: "Illegal", + }, + pichuspikyeared: { + isNonstandard: "Past", + tier: "Illegal", + }, + pikachu: { + tier: "NFE", + }, + pikachucosplay: { + isNonstandard: "Past", + tier: "Illegal", + }, + pikachurockstar: { + isNonstandard: "Past", + tier: "Illegal", + }, + pikachubelle: { + isNonstandard: "Past", + tier: "Illegal", + }, + pikachupopstar: { + isNonstandard: "Past", + tier: "Illegal", + }, + pikachuphd: { + isNonstandard: "Past", + tier: "Illegal", + }, + pikachulibre: { + isNonstandard: "Past", + tier: "Illegal", + }, + pikachuoriginal: { + isNonstandard: "Past", + tier: "Illegal", + }, + pikachuhoenn: { + isNonstandard: "Past", + tier: "Illegal", + }, + pikachusinnoh: { + isNonstandard: "Past", + tier: "Illegal", + }, + pikachuunova: { + isNonstandard: "Past", + tier: "Illegal", + }, + pikachukalos: { + isNonstandard: "Past", + tier: "Illegal", + }, + pikachualola: { + isNonstandard: "Past", + tier: "Illegal", + }, + pikachupartner: { + isNonstandard: "Past", + tier: "Illegal", + }, + pikachustarter: { + isNonstandard: "LGPE", + tier: "Illegal", + }, + pikachugmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + pikachuworld: { + isNonstandard: "Past", + tier: "Illegal", + }, + raichu: { + tier: "OU", + }, + raichualola: { + tier: "OU", + }, + raichumegax: { + isNonstandard: "Past", + tier: "Illegal", + }, + raichumegay: { + isNonstandard: "Past", + tier: "Illegal", + }, + sandshrew: { + isNonstandard: "Past", + tier: "Illegal", + }, + sandshrewalola: { + isNonstandard: "Past", + tier: "Illegal", + }, + sandslash: { + isNonstandard: "Past", + tier: "Illegal", + }, + sandslashalola: { + isNonstandard: "Past", + tier: "Illegal", + }, + nidoranf: { + isNonstandard: "Past", + tier: "Illegal", + }, + nidorina: { + isNonstandard: "Past", + tier: "Illegal", + }, + nidoqueen: { + isNonstandard: "Past", + tier: "Illegal", + }, + nidoranm: { + isNonstandard: "Past", + tier: "Illegal", + }, + nidorino: { + isNonstandard: "Past", + tier: "Illegal", + }, + nidoking: { + isNonstandard: "Past", + tier: "Illegal", + }, + cleffa: { + isNonstandard: "Past", + tier: "Illegal", + }, + clefairy: { + isNonstandard: "Past", + tier: "Illegal", + }, + clefable: { + tier: "OU", + }, + clefablemega: { + tier: "OU", + }, + vulpix: { + isNonstandard: "Past", + tier: "Illegal", + }, + vulpixalola: { + isNonstandard: "Past", + tier: "Illegal", + }, + ninetales: { + tier: "OU", + }, + ninetalesalola: { + tier: "OU", + }, + igglybuff: { + isNonstandard: "Past", + tier: "Illegal", + }, + jigglypuff: { + isNonstandard: "Past", + tier: "Illegal", + }, + wigglytuff: { + isNonstandard: "Past", + tier: "Illegal", + }, + zubat: { + isNonstandard: "Past", + tier: "Illegal", + }, + golbat: { + isNonstandard: "Past", + tier: "Illegal", + }, + crobat: { + isNonstandard: "Past", + tier: "Illegal", + }, + oddish: { + isNonstandard: "Past", + tier: "Illegal", + }, + gloom: { + isNonstandard: "Past", + tier: "Illegal", + }, + vileplume: { + isNonstandard: "Past", + tier: "Illegal", + }, + bellossom: { + isNonstandard: "Past", + tier: "Illegal", + }, + paras: { + isNonstandard: "Past", + tier: "Illegal", + }, + parasect: { + isNonstandard: "Past", + tier: "Illegal", + }, + venonat: { + isNonstandard: "Past", + tier: "Illegal", + }, + venomoth: { + isNonstandard: "Past", + tier: "Illegal", + }, + diglett: { + isNonstandard: "Past", + tier: "Illegal", + }, + diglettalola: { + isNonstandard: "Past", + tier: "Illegal", + }, + dugtrio: { + isNonstandard: "Past", + tier: "Illegal", + }, + dugtrioalola: { + isNonstandard: "Past", + tier: "Illegal", + }, + meowth: { + isNonstandard: "Past", + tier: "Illegal", + }, + meowthalola: { + isNonstandard: "Past", + tier: "Illegal", + }, + meowthgalar: { + isNonstandard: "Past", + tier: "Illegal", + }, + meowthgmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + persian: { + isNonstandard: "Past", + tier: "Illegal", + }, + persianalola: { + isNonstandard: "Past", + tier: "Illegal", + }, + perrserker: { + isNonstandard: "Past", + tier: "Illegal", + }, + psyduck: { + isNonstandard: "Past", + tier: "Illegal", + }, + golduck: { + isNonstandard: "Past", + tier: "Illegal", + }, + mankey: { + isNonstandard: "Past", + tier: "Illegal", + }, + primeape: { + isNonstandard: "Past", + tier: "Illegal", + }, + growlithe: { + isNonstandard: "Past", + tier: "Illegal", + }, + growlithehisui: { + isNonstandard: "Past", + tier: "Illegal", + }, + arcanine: { + tier: "OU", + }, + arcaninehisui: { + tier: "OU", + }, + poliwag: { + isNonstandard: "Past", + tier: "Illegal", + }, + poliwhirl: { + isNonstandard: "Past", + tier: "Illegal", + }, + poliwrath: { + isNonstandard: "Past", + tier: "Illegal", + }, + politoed: { + tier: "OU", + }, + abra: { + isNonstandard: "Past", + tier: "Illegal", + }, + kadabra: { + isNonstandard: "Past", + tier: "Illegal", + }, + alakazam: { + tier: "OU", + }, + alakazammega: { + tier: "OU", + }, + machop: { + isNonstandard: "Past", + tier: "Illegal", + }, + machoke: { + isNonstandard: "Past", + tier: "Illegal", + }, + machamp: { + tier: "OU", + }, + machampgmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + bellsprout: { + isNonstandard: "Past", + tier: "Illegal", + }, + weepinbell: { + isNonstandard: "Past", + tier: "Illegal", + }, + victreebel: { + tier: "OU", + }, + victreebelmega: { + tier: "OU", + }, + tentacool: { + isNonstandard: "Past", + tier: "Illegal", + }, + tentacruel: { + isNonstandard: "Past", + tier: "Illegal", + }, + geodude: { + isNonstandard: "Past", + tier: "Illegal", + }, + geodudealola: { + isNonstandard: "Past", + tier: "Illegal", + }, + graveler: { + isNonstandard: "Past", + tier: "Illegal", + }, + graveleralola: { + isNonstandard: "Past", + tier: "Illegal", + }, + golem: { + isNonstandard: "Past", + tier: "Illegal", + }, + golemalola: { + isNonstandard: "Past", + tier: "Illegal", + }, + ponyta: { + isNonstandard: "Past", + tier: "Illegal", + }, + ponytagalar: { + isNonstandard: "Past", + tier: "Illegal", + }, + rapidash: { + isNonstandard: "Past", + tier: "Illegal", + }, + rapidashgalar: { + isNonstandard: "Past", + tier: "Illegal", + }, + slowpoke: { + isNonstandard: "Past", + tier: "Illegal", + }, + slowpokegalar: { + isNonstandard: "Past", + tier: "Illegal", + }, + slowbro: { + tier: "OU", + }, + slowbromega: { + tier: "OU", + }, + slowbrogalar: { + tier: "OU", + }, + slowking: { + tier: "OU", + }, + slowkinggalar: { + tier: "OU", + }, + magnemite: { + isNonstandard: "Past", + tier: "Illegal", + }, + magneton: { + isNonstandard: "Past", + tier: "Illegal", + }, + magnezone: { + isNonstandard: "Past", + tier: "Illegal", + }, + farfetchd: { + isNonstandard: "Past", + tier: "Illegal", + }, + farfetchdgalar: { + isNonstandard: "Past", + tier: "Illegal", + }, + sirfetchd: { + isNonstandard: "Past", + tier: "Illegal", + }, + doduo: { + isNonstandard: "Past", + tier: "Illegal", + }, + dodrio: { + isNonstandard: "Past", + tier: "Illegal", + }, + seel: { + isNonstandard: "Past", + tier: "Illegal", + }, + dewgong: { + isNonstandard: "Past", + tier: "Illegal", + }, + grimer: { + isNonstandard: "Past", + tier: "Illegal", + }, + grimeralola: { + isNonstandard: "Past", + tier: "Illegal", + }, + muk: { + isNonstandard: "Past", + tier: "Illegal", + }, + mukalola: { + isNonstandard: "Past", + tier: "Illegal", + }, + shellder: { + isNonstandard: "Past", + tier: "Illegal", + }, + cloyster: { + isNonstandard: "Past", + tier: "Illegal", + }, + gastly: { + isNonstandard: "Past", + tier: "Illegal", + }, + haunter: { + isNonstandard: "Past", + tier: "Illegal", + }, + gengar: { + tier: "OU", + }, + gengarmega: { + tier: "OU", + }, + gengargmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + onix: { + isNonstandard: "Past", + tier: "Illegal", + }, + steelix: { + tier: "OU", + }, + steelixmega: { + tier: "OU", + }, + drowzee: { + isNonstandard: "Past", + tier: "Illegal", + }, + hypno: { + isNonstandard: "Past", + tier: "Illegal", + }, + krabby: { + isNonstandard: "Past", + tier: "Illegal", + }, + kingler: { + isNonstandard: "Past", + tier: "Illegal", + }, + kinglergmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + voltorb: { + isNonstandard: "Past", + tier: "Illegal", + }, + voltorbhisui: { + isNonstandard: "Past", + tier: "Illegal", + }, + electrode: { + isNonstandard: "Past", + tier: "Illegal", + }, + electrodehisui: { + isNonstandard: "Past", + tier: "Illegal", + }, + exeggcute: { + isNonstandard: "Past", + tier: "Illegal", + }, + exeggutor: { + isNonstandard: "Past", + tier: "Illegal", + }, + exeggutoralola: { + isNonstandard: "Past", + tier: "Illegal", + }, + cubone: { + isNonstandard: "Past", + tier: "Illegal", + }, + marowak: { + isNonstandard: "Past", + tier: "Illegal", + }, + marowakalola: { + isNonstandard: "Past", + tier: "Illegal", + }, + marowakalolatotem: { + isNonstandard: "Past", + tier: "Illegal", + }, + tyrogue: { + isNonstandard: "Past", + tier: "Illegal", + }, + hitmonlee: { + isNonstandard: "Past", + tier: "Illegal", + }, + hitmonchan: { + isNonstandard: "Past", + tier: "Illegal", + }, + hitmontop: { + isNonstandard: "Past", + tier: "Illegal", + }, + lickitung: { + isNonstandard: "Past", + tier: "Illegal", + }, + lickilicky: { + isNonstandard: "Past", + tier: "Illegal", + }, + koffing: { + isNonstandard: "Past", + tier: "Illegal", + }, + weezing: { + isNonstandard: "Past", + tier: "Illegal", + }, + weezinggalar: { + isNonstandard: "Past", + tier: "Illegal", + }, + rhyhorn: { + isNonstandard: "Past", + tier: "Illegal", + }, + rhydon: { + isNonstandard: "Past", + tier: "Illegal", + }, + rhyperior: { + tier: "OU", + }, + happiny: { + isNonstandard: "Past", + tier: "Illegal", + }, + chansey: { + isNonstandard: "Past", + tier: "Illegal", + }, + blissey: { + isNonstandard: "Past", + tier: "Illegal", + }, + tangela: { + isNonstandard: "Past", + tier: "Illegal", + }, + tangrowth: { + isNonstandard: "Past", + tier: "Illegal", + }, + kangaskhan: { + tier: "OU", + }, + kangaskhanmega: { + tier: "OU", + }, + horsea: { + isNonstandard: "Past", + tier: "Illegal", + }, + seadra: { + isNonstandard: "Past", + tier: "Illegal", + }, + kingdra: { + isNonstandard: "Past", + tier: "Illegal", + }, + goldeen: { + isNonstandard: "Past", + tier: "Illegal", + }, + seaking: { + isNonstandard: "Past", + tier: "Illegal", + }, + staryu: { + isNonstandard: "Past", + tier: "Illegal", + }, + starmie: { + tier: "OU", + }, + starmiemega: { + tier: "OU", + }, + mimejr: { + isNonstandard: "Past", + tier: "Illegal", + }, + mrmime: { + isNonstandard: "Past", + tier: "Illegal", + }, + mrmimegalar: { + isNonstandard: "Past", + tier: "Illegal", + }, + mrrime: { + tier: "OU", + }, + scyther: { + isNonstandard: "Past", + tier: "Illegal", + }, + scizor: { + tier: "OU", + }, + scizormega: { + tier: "OU", + }, + kleavor: { + tier: "OU", + }, + smoochum: { + isNonstandard: "Past", + tier: "Illegal", + }, + jynx: { + isNonstandard: "Past", + tier: "Illegal", + }, + elekid: { + isNonstandard: "Past", + tier: "Illegal", + }, + electabuzz: { + isNonstandard: "Past", + tier: "Illegal", + }, + electivire: { + isNonstandard: "Past", + tier: "Illegal", + }, + magby: { + isNonstandard: "Past", + tier: "Illegal", + }, + magmar: { + isNonstandard: "Past", + tier: "Illegal", + }, + magmortar: { + isNonstandard: "Past", + tier: "Illegal", + }, + pinsir: { + tier: "OU", + }, + pinsirmega: { + tier: "OU", + }, + tauros: { + tier: "OU", + }, + taurospaldeacombat: { + tier: "OU", + }, + taurospaldeablaze: { + tier: "OU", + }, + taurospaldeaaqua: { + tier: "OU", + }, + magikarp: { + isNonstandard: "Past", + tier: "Illegal", + }, + gyarados: { + tier: "OU", + }, + gyaradosmega: { + tier: "OU", + }, + lapras: { + isNonstandard: "Past", + tier: "Illegal", + }, + laprasgmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + ditto: { + tier: "OU", + }, + eevee: { + isNonstandard: "Past", + tier: "Illegal", + }, + eeveestarter: { + isNonstandard: "LGPE", + tier: "Illegal", + }, + eeveegmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + vaporeon: { + tier: "OU", + }, + jolteon: { + tier: "OU", + }, + flareon: { + tier: "OU", + }, + espeon: { + tier: "OU", + }, + umbreon: { + tier: "OU", + }, + leafeon: { + tier: "OU", + }, + glaceon: { + tier: "OU", + }, + sylveon: { + tier: "OU", + }, + porygon: { + isNonstandard: "Past", + tier: "Illegal", + }, + porygon2: { + isNonstandard: "Past", + tier: "Illegal", + }, + porygonz: { + isNonstandard: "Past", + tier: "Illegal", + }, + omanyte: { + isNonstandard: "Past", + tier: "Illegal", + }, + omastar: { + isNonstandard: "Past", + tier: "Illegal", + }, + kabuto: { + isNonstandard: "Past", + tier: "Illegal", + }, + kabutops: { + isNonstandard: "Past", + tier: "Illegal", + }, + aerodactyl: { + tier: "OU", + }, + aerodactylmega: { + tier: "OU", + }, + munchlax: { + isNonstandard: "Past", + tier: "Illegal", + }, + snorlax: { + tier: "OU", + }, + snorlaxgmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + articuno: { + isNonstandard: "Past", + tier: "Illegal", + }, + articunogalar: { + isNonstandard: "Past", + tier: "Illegal", + }, + zapdos: { + isNonstandard: "Past", + tier: "Illegal", + }, + zapdosgalar: { + isNonstandard: "Past", + tier: "Illegal", + }, + moltres: { + isNonstandard: "Past", + tier: "Illegal", + }, + moltresgalar: { + isNonstandard: "Past", + tier: "Illegal", + }, + dratini: { + isNonstandard: "Past", + tier: "Illegal", + }, + dragonair: { + isNonstandard: "Past", + tier: "Illegal", + }, + dragonite: { + tier: "OU", + }, + dragonitemega: { + tier: "OU", + }, + mewtwo: { + isNonstandard: "Past", + tier: "Illegal", + }, + mewtwomegax: { + isNonstandard: "Past", + tier: "Illegal", + }, + mewtwomegay: { + isNonstandard: "Past", + tier: "Illegal", + }, + mew: { + isNonstandard: "Past", + tier: "Illegal", + }, + chikorita: { + isNonstandard: "Past", + tier: "Illegal", + }, + bayleef: { + isNonstandard: "Past", + tier: "Illegal", + }, + meganium: { + tier: "OU", + }, + meganiummega: { + tier: "OU", + }, + cyndaquil: { + isNonstandard: "Past", + tier: "Illegal", + }, + quilava: { + isNonstandard: "Past", + tier: "Illegal", + }, + typhlosion: { + tier: "OU", + }, + typhlosionhisui: { + tier: "OU", + }, + totodile: { + isNonstandard: "Past", + tier: "Illegal", + }, + croconaw: { + isNonstandard: "Past", + tier: "Illegal", + }, + feraligatr: { + tier: "OU", + }, + feraligatrmega: { + tier: "OU", + }, + sentret: { + isNonstandard: "Past", + tier: "Illegal", + }, + furret: { + isNonstandard: "Past", + tier: "Illegal", + }, + hoothoot: { + isNonstandard: "Past", + tier: "Illegal", + }, + noctowl: { + isNonstandard: "Past", + tier: "Illegal", + }, + ledyba: { + isNonstandard: "Past", + tier: "Illegal", + }, + ledian: { + isNonstandard: "Past", + tier: "Illegal", + }, + spinarak: { + isNonstandard: "Past", + tier: "Illegal", + }, + ariados: { + tier: "OU", + }, + chinchou: { + isNonstandard: "Past", + tier: "Illegal", + }, + lanturn: { + isNonstandard: "Past", + tier: "Illegal", + }, + togepi: { + isNonstandard: "Past", + tier: "Illegal", + }, + togetic: { + isNonstandard: "Past", + tier: "Illegal", + }, + togekiss: { + isNonstandard: "Past", + tier: "Illegal", + }, + natu: { + isNonstandard: "Past", + tier: "Illegal", + }, + xatu: { + isNonstandard: "Past", + tier: "Illegal", + }, + mareep: { + isNonstandard: "Past", + tier: "Illegal", + }, + flaaffy: { + isNonstandard: "Past", + tier: "Illegal", + }, + ampharos: { + tier: "OU", + }, + ampharosmega: { + tier: "OU", + }, + azurill: { + isNonstandard: "Past", + tier: "Illegal", + }, + marill: { + isNonstandard: "Past", + tier: "Illegal", + }, + azumarill: { + tier: "OU", + }, + bonsly: { + isNonstandard: "Past", + tier: "Illegal", + }, + sudowoodo: { + isNonstandard: "Past", + tier: "Illegal", + }, + hoppip: { + isNonstandard: "Past", + tier: "Illegal", + }, + skiploom: { + isNonstandard: "Past", + tier: "Illegal", + }, + jumpluff: { + isNonstandard: "Past", + tier: "Illegal", + }, + aipom: { + isNonstandard: "Past", + tier: "Illegal", + }, + ambipom: { + isNonstandard: "Past", + tier: "Illegal", + }, + sunkern: { + isNonstandard: "Past", + tier: "Illegal", + }, + sunflora: { + isNonstandard: "Past", + tier: "Illegal", + }, + yanma: { + isNonstandard: "Past", + tier: "Illegal", + }, + yanmega: { + isNonstandard: "Past", + tier: "Illegal", + }, + wooper: { + isNonstandard: "Past", + tier: "Illegal", + }, + wooperpaldea: { + isNonstandard: "Past", + tier: "Illegal", + }, + quagsire: { + isNonstandard: "Past", + tier: "Illegal", + }, + murkrow: { + isNonstandard: "Past", + tier: "Illegal", + }, + honchkrow: { + isNonstandard: "Past", + tier: "Illegal", + }, + misdreavus: { + isNonstandard: "Past", + tier: "Illegal", + }, + mismagius: { + isNonstandard: "Past", + tier: "Illegal", + }, + unown: { + isNonstandard: "Past", + tier: "Illegal", + }, + wynaut: { + isNonstandard: "Past", + tier: "Illegal", + }, + wobbuffet: { + isNonstandard: "Past", + tier: "Illegal", + }, + girafarig: { + isNonstandard: "Past", + tier: "Illegal", + }, + farigiraf: { + tier: "OU", + }, + pineco: { + isNonstandard: "Past", + tier: "Illegal", + }, + forretress: { + tier: "OU", + }, + dunsparce: { + isNonstandard: "Past", + tier: "Illegal", + }, + dudunsparce: { + isNonstandard: "Past", + tier: "Illegal", + }, + gligar: { + isNonstandard: "Past", + tier: "Illegal", + }, + gliscor: { + tier: "OU", + }, + snubbull: { + isNonstandard: "Past", + tier: "Illegal", + }, + granbull: { + isNonstandard: "Past", + tier: "Illegal", + }, + qwilfish: { + isNonstandard: "Past", + tier: "Illegal", + }, + qwilfishhisui: { + isNonstandard: "Past", + tier: "Illegal", + }, + overqwil: { + isNonstandard: "Past", + tier: "Illegal", + }, + shuckle: { + isNonstandard: "Past", + tier: "Illegal", + }, + heracross: { + tier: "OU", + }, + heracrossmega: { + tier: "OU", + }, + sneasel: { + isNonstandard: "Past", + tier: "Illegal", + }, + sneaselhisui: { + isNonstandard: "Past", + tier: "Illegal", + }, + weavile: { + tier: "OU", + }, + sneasler: { + tier: "OU", + }, + teddiursa: { + isNonstandard: "Past", + tier: "Illegal", + }, + ursaring: { + isNonstandard: "Past", + tier: "Illegal", + }, + ursaluna: { + isNonstandard: "Past", + tier: "Illegal", + }, + ursalunabloodmoon: { + isNonstandard: "Past", + tier: "Illegal", + }, + slugma: { + isNonstandard: "Past", + tier: "Illegal", + }, + magcargo: { + isNonstandard: "Past", + tier: "Illegal", + }, + swinub: { + isNonstandard: "Past", + tier: "Illegal", + }, + piloswine: { + isNonstandard: "Past", + tier: "Illegal", + }, + mamoswine: { + tier: "OU", + }, + corsola: { + isNonstandard: "Past", + tier: "Illegal", + }, + corsolagalar: { + isNonstandard: "Past", + tier: "Illegal", + }, + cursola: { + isNonstandard: "Past", + tier: "Illegal", + }, + remoraid: { + isNonstandard: "Past", + tier: "Illegal", + }, + octillery: { + isNonstandard: "Past", + tier: "Illegal", + }, + delibird: { + isNonstandard: "Past", + tier: "Illegal", + }, + mantyke: { + isNonstandard: "Past", + tier: "Illegal", + }, + mantine: { + isNonstandard: "Past", + tier: "Illegal", + }, + skarmory: { + tier: "OU", + }, + skarmorymega: { + tier: "OU", + }, + houndour: { + isNonstandard: "Past", + tier: "Illegal", + }, + houndoom: { + tier: "OU", + }, + houndoommega: { + tier: "OU", + }, + phanpy: { + isNonstandard: "Past", + tier: "Illegal", + }, + donphan: { + isNonstandard: "Past", + tier: "Illegal", + }, + stantler: { + isNonstandard: "Past", + tier: "Illegal", + }, + wyrdeer: { + tier: "OU", + }, + smeargle: { + isNonstandard: "Past", + tier: "Illegal", + }, + miltank: { + isNonstandard: "Past", + tier: "Illegal", + }, + raikou: { + isNonstandard: "Past", + tier: "Illegal", + }, + entei: { + isNonstandard: "Past", + tier: "Illegal", + }, + suicune: { + isNonstandard: "Past", + tier: "Illegal", + }, + larvitar: { + isNonstandard: "Past", + tier: "Illegal", + }, + pupitar: { + isNonstandard: "Past", + tier: "Illegal", + }, + tyranitar: { + tier: "OU", + }, + tyranitarmega: { + tier: "OU", + }, + lugia: { + isNonstandard: "Past", + tier: "Illegal", + }, + hooh: { + isNonstandard: "Past", + tier: "Illegal", + }, + celebi: { + isNonstandard: "Past", + tier: "Illegal", + }, + treecko: { + isNonstandard: "Past", + tier: "Illegal", + }, + grovyle: { + isNonstandard: "Past", + tier: "Illegal", + }, + sceptile: { + isNonstandard: "Past", + tier: "Illegal", + }, + sceptilemega: { + isNonstandard: "Past", + tier: "Illegal", + }, + torchic: { + isNonstandard: "Past", + tier: "Illegal", + }, + combusken: { + isNonstandard: "Past", + tier: "Illegal", + }, + blaziken: { + isNonstandard: "Past", + tier: "Illegal", + }, + blazikenmega: { + isNonstandard: "Past", + tier: "Illegal", + }, + mudkip: { + isNonstandard: "Past", + tier: "Illegal", + }, + marshtomp: { + isNonstandard: "Past", + tier: "Illegal", + }, + swampert: { + isNonstandard: "Past", + tier: "Illegal", + }, + swampertmega: { + isNonstandard: "Past", + tier: "Illegal", + }, + poochyena: { + isNonstandard: "Past", + tier: "Illegal", + }, + mightyena: { + isNonstandard: "Past", + tier: "Illegal", + }, + zigzagoon: { + isNonstandard: "Past", + tier: "Illegal", + }, + zigzagoongalar: { + isNonstandard: "Past", + tier: "Illegal", + }, + linoone: { + isNonstandard: "Past", + tier: "Illegal", + }, + linoonegalar: { + isNonstandard: "Past", + tier: "Illegal", + }, + obstagoon: { + isNonstandard: "Past", + tier: "Illegal", + }, + wurmple: { + isNonstandard: "Past", + tier: "Illegal", + }, + silcoon: { + isNonstandard: "Past", + tier: "Illegal", + }, + beautifly: { + isNonstandard: "Past", + tier: "Illegal", + }, + cascoon: { + isNonstandard: "Past", + tier: "Illegal", + }, + dustox: { + isNonstandard: "Past", + tier: "Illegal", + }, + lotad: { + isNonstandard: "Past", + tier: "Illegal", + }, + lombre: { + isNonstandard: "Past", + tier: "Illegal", + }, + ludicolo: { + isNonstandard: "Past", + tier: "Illegal", + }, + seedot: { + isNonstandard: "Past", + tier: "Illegal", + }, + nuzleaf: { + isNonstandard: "Past", + tier: "Illegal", + }, + shiftry: { + isNonstandard: "Past", + tier: "Illegal", + }, + taillow: { + isNonstandard: "Past", + tier: "Illegal", + }, + swellow: { + isNonstandard: "Past", + tier: "Illegal", + }, + wingull: { + isNonstandard: "Past", + tier: "Illegal", + }, + pelipper: { + tier: "OU", + }, + ralts: { + isNonstandard: "Past", + tier: "Illegal", + }, + kirlia: { + isNonstandard: "Past", + tier: "Illegal", + }, + gardevoir: { + tier: "OU", + }, + gardevoirmega: { + tier: "OU", + }, + gallade: { + tier: "OU", + }, + gallademega: { + tier: "OU", + }, + surskit: { + isNonstandard: "Past", + tier: "Illegal", + }, + masquerain: { + isNonstandard: "Past", + tier: "Illegal", + }, + shroomish: { + isNonstandard: "Past", + tier: "Illegal", + }, + breloom: { + isNonstandard: "Past", + tier: "Illegal", + }, + slakoth: { + isNonstandard: "Past", + tier: "Illegal", + }, + vigoroth: { + isNonstandard: "Past", + tier: "Illegal", + }, + slaking: { + isNonstandard: "Past", + tier: "Illegal", + }, + nincada: { + isNonstandard: "Past", + tier: "Illegal", + }, + ninjask: { + isNonstandard: "Past", + tier: "Illegal", + }, + shedinja: { + isNonstandard: "Past", + tier: "Illegal", + }, + whismur: { + isNonstandard: "Past", + tier: "Illegal", + }, + loudred: { + isNonstandard: "Past", + tier: "Illegal", + }, + exploud: { + isNonstandard: "Past", + tier: "Illegal", + }, + makuhita: { + isNonstandard: "Past", + tier: "Illegal", + }, + hariyama: { + isNonstandard: "Past", + tier: "Illegal", + }, + nosepass: { + isNonstandard: "Past", + tier: "Illegal", + }, + probopass: { + isNonstandard: "Past", + tier: "Illegal", + }, + skitty: { + isNonstandard: "Past", + tier: "Illegal", + }, + delcatty: { + isNonstandard: "Past", + tier: "Illegal", + }, + sableye: { + tier: "OU", + }, + sableyemega: { + tier: "OU", + }, + mawile: { + isNonstandard: "Past", + tier: "Illegal", + }, + mawilemega: { + isNonstandard: "Past", + tier: "Illegal", + }, + aron: { + isNonstandard: "Past", + tier: "Illegal", + }, + lairon: { + isNonstandard: "Past", + tier: "Illegal", + }, + aggron: { + tier: "OU", + }, + aggronmega: { + tier: "OU", + }, + meditite: { + isNonstandard: "Past", + tier: "Illegal", + }, + medicham: { + tier: "OU", + }, + medichammega: { + tier: "OU", + }, + electrike: { + isNonstandard: "Past", + tier: "Illegal", + }, + manectric: { + tier: "OU", + }, + manectricmega: { + tier: "OU", + }, + plusle: { + isNonstandard: "Past", + tier: "Illegal", + }, + minun: { + isNonstandard: "Past", + tier: "Illegal", + }, + volbeat: { + isNonstandard: "Past", + tier: "Illegal", + }, + illumise: { + isNonstandard: "Past", + tier: "Illegal", + }, + budew: { + isNonstandard: "Past", + tier: "Illegal", + }, + roselia: { + isNonstandard: "Past", + tier: "Illegal", + }, + roserade: { + tier: "OU", + }, + gulpin: { + isNonstandard: "Past", + tier: "Illegal", + }, + swalot: { + isNonstandard: "Past", + tier: "Illegal", + }, + carvanha: { + isNonstandard: "Past", + tier: "Illegal", + }, + sharpedo: { + tier: "OU", + }, + sharpedomega: { + tier: "OU", + }, + wailmer: { + isNonstandard: "Past", + tier: "Illegal", + }, + wailord: { + isNonstandard: "Past", + tier: "Illegal", + }, + numel: { + isNonstandard: "Past", + tier: "Illegal", + }, + camerupt: { + tier: "OU", + }, + cameruptmega: { + tier: "OU", + }, + torkoal: { + tier: "OU", + }, + spoink: { + isNonstandard: "Past", + tier: "Illegal", + }, + grumpig: { + isNonstandard: "Past", + tier: "Illegal", + }, + spinda: { + isNonstandard: "Past", + tier: "Illegal", + }, + trapinch: { + isNonstandard: "Past", + tier: "Illegal", + }, + vibrava: { + isNonstandard: "Past", + tier: "Illegal", + }, + flygon: { + isNonstandard: "Past", + tier: "Illegal", + }, + cacnea: { + isNonstandard: "Past", + tier: "Illegal", + }, + cacturne: { + isNonstandard: "Past", + tier: "Illegal", + }, + swablu: { + isNonstandard: "Past", + tier: "Illegal", + }, + altaria: { + tier: "OU", + }, + altariamega: { + tier: "OU", + }, + zangoose: { + isNonstandard: "Past", + tier: "Illegal", + }, + seviper: { + isNonstandard: "Past", + tier: "Illegal", + }, + lunatone: { + isNonstandard: "Past", + tier: "Illegal", + }, + solrock: { + isNonstandard: "Past", + tier: "Illegal", + }, + barboach: { + isNonstandard: "Past", + tier: "Illegal", + }, + whiscash: { + isNonstandard: "Past", + tier: "Illegal", + }, + corphish: { + isNonstandard: "Past", + tier: "Illegal", + }, + crawdaunt: { + isNonstandard: "Past", + tier: "Illegal", + }, + baltoy: { + isNonstandard: "Past", + tier: "Illegal", + }, + claydol: { + isNonstandard: "Past", + tier: "Illegal", + }, + lileep: { + isNonstandard: "Past", + tier: "Illegal", + }, + cradily: { + isNonstandard: "Past", + tier: "Illegal", + }, + anorith: { + isNonstandard: "Past", + tier: "Illegal", + }, + armaldo: { + isNonstandard: "Past", + tier: "Illegal", + }, + feebas: { + isNonstandard: "Past", + tier: "Illegal", + }, + milotic: { + tier: "OU", + }, + castform: { + tier: "OU", + }, + castformsunny: { + isNonstandard: "Past", + }, + castformrainy: { + isNonstandard: "Past", + }, + castformsnowy: { + isNonstandard: "Past", + }, + kecleon: { + isNonstandard: "Past", + tier: "Illegal", + }, + shuppet: { + isNonstandard: "Past", + tier: "Illegal", + }, + banette: { + tier: "OU", + }, + banettemega: { + tier: "OU", + }, + duskull: { + isNonstandard: "Past", + tier: "Illegal", + }, + dusclops: { + isNonstandard: "Past", + tier: "Illegal", + }, + dusknoir: { + isNonstandard: "Past", + tier: "Illegal", + }, + tropius: { + isNonstandard: "Past", + tier: "Illegal", + }, + chingling: { + isNonstandard: "Past", + tier: "Illegal", + }, + chimecho: { + tier: "OU", + }, + chimechomega: { + tier: "OU", + }, + absol: { + tier: "OU", + }, + absolmega: { + tier: "OU", + }, + absolmegaz: { + isNonstandard: "Past", + tier: "Illegal", + }, + snorunt: { + isNonstandard: "Past", + tier: "Illegal", + }, + glalie: { + tier: "OU", + }, + glaliemega: { + tier: "OU", + }, + froslass: { + tier: "OU", + }, + froslassmega: { + tier: "OU", + }, + spheal: { + isNonstandard: "Past", + tier: "Illegal", + }, + sealeo: { + isNonstandard: "Past", + tier: "Illegal", + }, + walrein: { + isNonstandard: "Past", + tier: "Illegal", + }, + clamperl: { + isNonstandard: "Past", + tier: "Illegal", + }, + huntail: { + isNonstandard: "Past", + tier: "Illegal", + }, + gorebyss: { + isNonstandard: "Past", + tier: "Illegal", + }, + relicanth: { + isNonstandard: "Past", + tier: "Illegal", + }, + luvdisc: { + isNonstandard: "Past", + tier: "Illegal", + }, + bagon: { + isNonstandard: "Past", + tier: "Illegal", + }, + shelgon: { + isNonstandard: "Past", + tier: "Illegal", + }, + salamence: { + isNonstandard: "Past", + tier: "Illegal", + }, + salamencemega: { + isNonstandard: "Past", + tier: "Illegal", + }, + beldum: { + isNonstandard: "Past", + tier: "Illegal", + }, + metang: { + isNonstandard: "Past", + tier: "Illegal", + }, + metagross: { + isNonstandard: "Past", + tier: "Illegal", + }, + metagrossmega: { + isNonstandard: "Past", + tier: "Illegal", + }, + regirock: { + isNonstandard: "Past", + tier: "Illegal", + }, + regice: { + isNonstandard: "Past", + tier: "Illegal", + }, + registeel: { + isNonstandard: "Past", + tier: "Illegal", + }, + latias: { + isNonstandard: "Past", + tier: "Illegal", + }, + latiasmega: { + isNonstandard: "Past", + tier: "Illegal", + }, + latios: { + isNonstandard: "Past", + tier: "Illegal", + }, + latiosmega: { + isNonstandard: "Past", + tier: "Illegal", + }, + kyogre: { + isNonstandard: "Past", + tier: "Illegal", + }, + kyogreprimal: { + isNonstandard: "Past", + tier: "Illegal", + }, + groudon: { + isNonstandard: "Past", + tier: "Illegal", + }, + groudonprimal: { + isNonstandard: "Past", + tier: "Illegal", + }, + rayquaza: { + isNonstandard: "Past", + tier: "Illegal", + }, + rayquazamega: { + isNonstandard: "Past", + tier: "Illegal", + }, + jirachi: { + isNonstandard: "Past", + tier: "Illegal", + }, + deoxys: { + isNonstandard: "Past", + tier: "Illegal", + }, + deoxysattack: { + isNonstandard: "Past", + tier: "Illegal", + }, + deoxysdefense: { + isNonstandard: "Past", + tier: "Illegal", + }, + deoxysspeed: { + isNonstandard: "Past", + tier: "Illegal", + }, + turtwig: { + isNonstandard: "Past", + tier: "Illegal", + }, + grotle: { + isNonstandard: "Past", + tier: "Illegal", + }, + torterra: { + tier: "OU", + }, + chimchar: { + isNonstandard: "Past", + tier: "Illegal", + }, + monferno: { + isNonstandard: "Past", + tier: "Illegal", + }, + infernape: { + tier: "OU", + }, + piplup: { + isNonstandard: "Past", + tier: "Illegal", + }, + prinplup: { + isNonstandard: "Past", + tier: "Illegal", + }, + empoleon: { + tier: "OU", + }, + starly: { + isNonstandard: "Past", + tier: "Illegal", + }, + staravia: { + isNonstandard: "Past", + tier: "Illegal", + }, + staraptor: { + isNonstandard: "Past", + tier: "Illegal", + }, + staraptormega: { + isNonstandard: "Future", + tier: "Illegal", + }, + bidoof: { + isNonstandard: "Past", + tier: "Illegal", + }, + bibarel: { + isNonstandard: "Past", + tier: "Illegal", + }, + kricketot: { + isNonstandard: "Past", + tier: "Illegal", + }, + kricketune: { + isNonstandard: "Past", + tier: "Illegal", + }, + shinx: { + isNonstandard: "Past", + tier: "Illegal", + }, + luxio: { + isNonstandard: "Past", + tier: "Illegal", + }, + luxray: { + tier: "OU", + }, + cranidos: { + isNonstandard: "Past", + tier: "Illegal", + }, + rampardos: { + tier: "OU", + }, + shieldon: { + isNonstandard: "Past", + tier: "Illegal", + }, + bastiodon: { + tier: "OU", + }, + burmy: { + isNonstandard: "Past", + tier: "Illegal", + }, + wormadam: { + isNonstandard: "Past", + tier: "Illegal", + }, + wormadamsandy: { + isNonstandard: "Past", + tier: "Illegal", + }, + wormadamtrash: { + isNonstandard: "Past", + tier: "Illegal", + }, + mothim: { + isNonstandard: "Past", + tier: "Illegal", + }, + combee: { + isNonstandard: "Past", + tier: "Illegal", + }, + vespiquen: { + isNonstandard: "Past", + tier: "Illegal", + }, + pachirisu: { + isNonstandard: "Past", + tier: "Illegal", + }, + buizel: { + isNonstandard: "Past", + tier: "Illegal", + }, + floatzel: { + isNonstandard: "Past", + tier: "Illegal", + }, + cherubi: { + isNonstandard: "Past", + tier: "Illegal", + }, + cherrim: { + isNonstandard: "Past", + tier: "Illegal", + }, + cherrimsunshine: { + isNonstandard: "Past", + }, + shellos: { + isNonstandard: "Past", + tier: "Illegal", + }, + gastrodon: { + isNonstandard: "Past", + tier: "Illegal", + }, + drifloon: { + isNonstandard: "Past", + tier: "Illegal", + }, + drifblim: { + isNonstandard: "Past", + tier: "Illegal", + }, + buneary: { + isNonstandard: "Past", + tier: "Illegal", + }, + lopunny: { + tier: "OU", + }, + lopunnymega: { + tier: "OU", + }, + glameow: { + isNonstandard: "Past", + tier: "Illegal", + }, + purugly: { + isNonstandard: "Past", + tier: "Illegal", + }, + stunky: { + isNonstandard: "Past", + tier: "Illegal", + }, + skuntank: { + isNonstandard: "Past", + tier: "Illegal", + }, + bronzor: { + isNonstandard: "Past", + tier: "Illegal", + }, + bronzong: { + isNonstandard: "Past", + tier: "Illegal", + }, + chatot: { + isNonstandard: "Past", + tier: "Illegal", + }, + spiritomb: { + tier: "OU", + }, + gible: { + isNonstandard: "Past", + tier: "Illegal", + }, + gabite: { + isNonstandard: "Past", + tier: "Illegal", + }, + garchomp: { + tier: "OU", + }, + garchompmega: { + tier: "OU", + }, + garchompmegaz: { + isNonstandard: "Past", + tier: "Illegal", + }, + riolu: { + isNonstandard: "Past", + tier: "Illegal", + }, + lucario: { + tier: "OU", + }, + lucariomega: { + tier: "OU", + }, + lucariomegaz: { + isNonstandard: "Past", + tier: "Illegal", + }, + hippopotas: { + isNonstandard: "Past", + tier: "Illegal", + }, + hippowdon: { + tier: "OU", + }, + skorupi: { + isNonstandard: "Past", + tier: "Illegal", + }, + drapion: { + isNonstandard: "Past", + tier: "Illegal", + }, + croagunk: { + isNonstandard: "Past", + tier: "Illegal", + }, + toxicroak: { + tier: "OU", + }, + carnivine: { + isNonstandard: "Past", + tier: "Illegal", + }, + finneon: { + isNonstandard: "Past", + tier: "Illegal", + }, + lumineon: { + isNonstandard: "Past", + tier: "Illegal", + }, + snover: { + isNonstandard: "Past", + tier: "Illegal", + }, + abomasnow: { + tier: "OU", + }, + abomasnowmega: { + tier: "OU", + }, + rotom: { + tier: "OU", + }, + rotomheat: { + tier: "OU", + }, + rotomwash: { + tier: "OU", + }, + rotomfrost: { + tier: "OU", + }, + rotomfan: { + tier: "OU", + }, + rotommow: { + tier: "OU", + }, + uxie: { + isNonstandard: "Past", + tier: "Illegal", + }, + mesprit: { + isNonstandard: "Past", + tier: "Illegal", + }, + azelf: { + isNonstandard: "Past", + tier: "Illegal", + }, + dialga: { + isNonstandard: "Past", + tier: "Illegal", + }, + dialgaorigin: { + isNonstandard: "Past", + tier: "Illegal", + }, + palkia: { + isNonstandard: "Past", + tier: "Illegal", + }, + palkiaorigin: { + isNonstandard: "Past", + tier: "Illegal", + }, + heatran: { + isNonstandard: "Past", + tier: "Illegal", + }, + heatranmega: { + isNonstandard: "Future", + tier: "Illegal", + }, + regigigas: { + isNonstandard: "Past", + tier: "Illegal", + }, + giratina: { + isNonstandard: "Past", + tier: "Illegal", + }, + giratinaorigin: { + isNonstandard: "Past", + tier: "Illegal", + }, + cresselia: { + isNonstandard: "Past", + tier: "Illegal", + }, + phione: { + isNonstandard: "Past", + tier: "Illegal", + }, + manaphy: { + isNonstandard: "Past", + tier: "Illegal", + }, + darkrai: { + isNonstandard: "Past", + tier: "Illegal", + }, + darkraimega: { + isNonstandard: "Future", + tier: "Illegal", + }, + shaymin: { + isNonstandard: "Past", + tier: "Illegal", + }, + shayminsky: { + isNonstandard: "Past", + tier: "Illegal", + }, + arceus: { + isNonstandard: "Past", + tier: "Illegal", + }, + victini: { + isNonstandard: "Past", + tier: "Illegal", + }, + snivy: { + isNonstandard: "Past", + tier: "Illegal", + }, + servine: { + isNonstandard: "Past", + tier: "Illegal", + }, + serperior: { + tier: "OU", + }, + tepig: { + isNonstandard: "Past", + tier: "Illegal", + }, + pignite: { + isNonstandard: "Past", + tier: "Illegal", + }, + emboar: { + tier: "OU", + }, + emboarmega: { + tier: "OU", + }, + oshawott: { + isNonstandard: "Past", + tier: "Illegal", + }, + dewott: { + isNonstandard: "Past", + tier: "Illegal", + }, + samurott: { + tier: "OU", + }, + samurotthisui: { + tier: "OU", + }, + patrat: { + isNonstandard: "Past", + tier: "Illegal", + }, + watchog: { + tier: "OU", + }, + lillipup: { + isNonstandard: "Past", + tier: "Illegal", + }, + herdier: { + isNonstandard: "Past", + tier: "Illegal", + }, + stoutland: { + isNonstandard: "Past", + tier: "Illegal", + }, + purrloin: { + isNonstandard: "Past", + tier: "Illegal", + }, + liepard: { + tier: "OU", + }, + pansage: { + isNonstandard: "Past", + tier: "Illegal", + }, + simisage: { + tier: "OU", + }, + pansear: { + isNonstandard: "Past", + tier: "Illegal", + }, + simisear: { + tier: "OU", + }, + panpour: { + isNonstandard: "Past", + tier: "Illegal", + }, + simipour: { + tier: "OU", + }, + munna: { + isNonstandard: "Past", + tier: "Illegal", + }, + musharna: { + isNonstandard: "Past", + tier: "Illegal", + }, + pidove: { + isNonstandard: "Past", + tier: "Illegal", + }, + tranquill: { + isNonstandard: "Past", + tier: "Illegal", + }, + unfezant: { + isNonstandard: "Past", + tier: "Illegal", + }, + blitzle: { + isNonstandard: "Past", + tier: "Illegal", + }, + zebstrika: { + isNonstandard: "Past", + tier: "Illegal", + }, + roggenrola: { + isNonstandard: "Past", + tier: "Illegal", + }, + boldore: { + isNonstandard: "Past", + tier: "Illegal", + }, + gigalith: { + isNonstandard: "Past", + tier: "Illegal", + }, + woobat: { + isNonstandard: "Past", + tier: "Illegal", + }, + swoobat: { + isNonstandard: "Past", + tier: "Illegal", + }, + drilbur: { + isNonstandard: "Past", + tier: "Illegal", + }, + excadrill: { + tier: "OU", + }, + excadrillmega: { + tier: "OU", + }, + audino: { + tier: "OU", + }, + audinomega: { + tier: "OU", + }, + timburr: { + isNonstandard: "Past", + tier: "Illegal", + }, + gurdurr: { + isNonstandard: "Past", + tier: "Illegal", + }, + conkeldurr: { + tier: "OU", + }, + tympole: { + isNonstandard: "Past", + tier: "Illegal", + }, + palpitoad: { + isNonstandard: "Past", + tier: "Illegal", + }, + seismitoad: { + isNonstandard: "Past", + tier: "Illegal", + }, + throh: { + isNonstandard: "Past", + tier: "Illegal", + }, + sawk: { + isNonstandard: "Past", + tier: "Illegal", + }, + sewaddle: { + isNonstandard: "Past", + tier: "Illegal", + }, + swadloon: { + isNonstandard: "Past", + tier: "Illegal", + }, + leavanny: { + isNonstandard: "Past", + tier: "Illegal", + }, + venipede: { + isNonstandard: "Past", + tier: "Illegal", + }, + whirlipede: { + isNonstandard: "Past", + tier: "Illegal", + }, + scolipede: { + isNonstandard: "Past", + tier: "Illegal", + }, + scolipedemega: { + isNonstandard: "Future", + tier: "Illegal", + }, + cottonee: { + isNonstandard: "Past", + tier: "Illegal", + }, + whimsicott: { + tier: "OU", + }, + petilil: { + isNonstandard: "Past", + tier: "Illegal", + }, + lilligant: { + isNonstandard: "Past", + tier: "Illegal", + }, + lilliganthisui: { + isNonstandard: "Past", + tier: "Illegal", + }, + basculin: { + isNonstandard: "Past", + tier: "Illegal", + }, + basculegion: { + tier: "OU", + }, + basculegionf: { + tier: "OU", + }, + sandile: { + isNonstandard: "Past", + tier: "Illegal", + }, + krokorok: { + isNonstandard: "Past", + tier: "Illegal", + }, + krookodile: { + tier: "OU", + }, + darumaka: { + isNonstandard: "Past", + tier: "Illegal", + }, + darumakagalar: { + isNonstandard: "Past", + tier: "Illegal", + }, + darmanitan: { + isNonstandard: "Past", + tier: "Illegal", + }, + darmanitanzen: { + isNonstandard: "Past", + }, + darmanitangalar: { + isNonstandard: "Past", + tier: "Illegal", + }, + darmanitangalarzen: { + isNonstandard: "Past", + }, + maractus: { + isNonstandard: "Past", + tier: "Illegal", + }, + dwebble: { + isNonstandard: "Past", + tier: "Illegal", + }, + crustle: { + isNonstandard: "Past", + tier: "Illegal", + }, + scraggy: { + isNonstandard: "Past", + tier: "Illegal", + }, + scrafty: { + isNonstandard: "Past", + tier: "Illegal", + }, + scraftymega: { + isNonstandard: "Future", + tier: "Illegal", + }, + sigilyph: { + isNonstandard: "Past", + tier: "Illegal", + }, + yamask: { + isNonstandard: "Past", + tier: "Illegal", + }, + yamaskgalar: { + isNonstandard: "Past", + tier: "Illegal", + }, + cofagrigus: { + tier: "OU", + }, + runerigus: { + tier: "OU", + }, + tirtouga: { + isNonstandard: "Past", + tier: "Illegal", + }, + carracosta: { + isNonstandard: "Past", + tier: "Illegal", + }, + archen: { + isNonstandard: "Past", + tier: "Illegal", + }, + archeops: { + isNonstandard: "Past", + tier: "Illegal", + }, + trubbish: { + isNonstandard: "Past", + tier: "Illegal", + }, + garbodor: { + tier: "OU", + }, + garbodorgmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + zorua: { + isNonstandard: "Past", + tier: "Illegal", + }, + zoruahisui: { + isNonstandard: "Past", + tier: "Illegal", + }, + zoroark: { + tier: "OU", + }, + zoroarkhisui: { + tier: "OU", + }, + minccino: { + isNonstandard: "Past", + tier: "Illegal", + }, + cinccino: { + isNonstandard: "Past", + tier: "Illegal", + }, + gothita: { + isNonstandard: "Past", + tier: "Illegal", + }, + gothorita: { + isNonstandard: "Past", + tier: "Illegal", + }, + gothitelle: { + isNonstandard: "Past", + tier: "Illegal", + }, + solosis: { + isNonstandard: "Past", + tier: "Illegal", + }, + duosion: { + isNonstandard: "Past", + tier: "Illegal", + }, + reuniclus: { + tier: "OU", + }, + ducklett: { + isNonstandard: "Past", + tier: "Illegal", + }, + swanna: { + isNonstandard: "Past", + tier: "Illegal", + }, + vanillite: { + isNonstandard: "Past", + tier: "Illegal", + }, + vanillish: { + isNonstandard: "Past", + tier: "Illegal", + }, + vanilluxe: { + tier: "OU", + }, + deerling: { + isNonstandard: "Past", + tier: "Illegal", + }, + sawsbuck: { + isNonstandard: "Past", + tier: "Illegal", + }, + emolga: { + tier: "OU", + }, + karrablast: { + isNonstandard: "Past", + tier: "Illegal", + }, + escavalier: { + isNonstandard: "Past", + tier: "Illegal", + }, + foongus: { + isNonstandard: "Past", + tier: "Illegal", + }, + amoonguss: { + isNonstandard: "Past", + tier: "Illegal", + }, + frillish: { + isNonstandard: "Past", + tier: "Illegal", + }, + jellicent: { + isNonstandard: "Past", + tier: "Illegal", + }, + alomomola: { + isNonstandard: "Past", + tier: "Illegal", + }, + joltik: { + isNonstandard: "Past", + tier: "Illegal", + }, + galvantula: { + isNonstandard: "Past", + tier: "Illegal", + }, + ferroseed: { + isNonstandard: "Past", + tier: "Illegal", + }, + ferrothorn: { + isNonstandard: "Past", + tier: "Illegal", + }, + klink: { + isNonstandard: "Past", + tier: "Illegal", + }, + klang: { + isNonstandard: "Past", + tier: "Illegal", + }, + klinklang: { + isNonstandard: "Past", + tier: "Illegal", + }, + tynamo: { + isNonstandard: "Past", + tier: "Illegal", + }, + eelektrik: { + isNonstandard: "Past", + tier: "Illegal", + }, + eelektross: { + isNonstandard: "Past", + tier: "Illegal", + }, + eelektrossmega: { + isNonstandard: "Future", + tier: "Illegal", + }, + elgyem: { + isNonstandard: "Past", + tier: "Illegal", + }, + beheeyem: { + isNonstandard: "Past", + tier: "Illegal", + }, + litwick: { + isNonstandard: "Past", + tier: "Illegal", + }, + lampent: { + isNonstandard: "Past", + tier: "Illegal", + }, + chandelure: { + tier: "OU", + }, + chandeluremega: { + tier: "OU", + }, + axew: { + isNonstandard: "Past", + tier: "Illegal", + }, + fraxure: { + isNonstandard: "Past", + tier: "Illegal", + }, + haxorus: { + isNonstandard: "Past", + tier: "Illegal", + }, + cubchoo: { + isNonstandard: "Past", + tier: "Illegal", + }, + beartic: { + tier: "OU", + }, + cryogonal: { + isNonstandard: "Past", + tier: "Illegal", + }, + shelmet: { + isNonstandard: "Past", + tier: "Illegal", + }, + accelgor: { + isNonstandard: "Past", + tier: "Illegal", + }, + stunfisk: { + tier: "OU", + }, + stunfiskgalar: { + tier: "OU", + }, + mienfoo: { + isNonstandard: "Past", + tier: "Illegal", + }, + mienshao: { + isNonstandard: "Past", + tier: "Illegal", + }, + druddigon: { + isNonstandard: "Past", + tier: "Illegal", + }, + golett: { + isNonstandard: "Past", + tier: "Illegal", + }, + golurk: { + tier: "OU", + }, + golurkmega: { + tier: "OU", + }, + pawniard: { + isNonstandard: "Past", + tier: "Illegal", + }, + bisharp: { + isNonstandard: "Past", + tier: "Illegal", + }, + bouffalant: { + isNonstandard: "Past", + tier: "Illegal", + }, + rufflet: { + isNonstandard: "Past", + tier: "Illegal", + }, + braviary: { + isNonstandard: "Past", + tier: "Illegal", + }, + braviaryhisui: { + isNonstandard: "Past", + tier: "Illegal", + }, + vullaby: { + isNonstandard: "Past", + tier: "Illegal", + }, + mandibuzz: { + isNonstandard: "Past", + tier: "Illegal", + }, + heatmor: { + isNonstandard: "Past", + tier: "Illegal", + }, + durant: { + isNonstandard: "Past", + tier: "Illegal", + }, + deino: { + isNonstandard: "Past", + tier: "Illegal", + }, + zweilous: { + isNonstandard: "Past", + tier: "Illegal", + }, + hydreigon: { + tier: "OU", + }, + larvesta: { + isNonstandard: "Past", + tier: "Illegal", + }, + volcarona: { + tier: "OU", + }, + cobalion: { + isNonstandard: "Past", + tier: "Illegal", + }, + terrakion: { + isNonstandard: "Past", + tier: "Illegal", + }, + virizion: { + isNonstandard: "Past", + tier: "Illegal", + }, + tornadus: { + isNonstandard: "Past", + tier: "Illegal", + }, + tornadustherian: { + isNonstandard: "Past", + tier: "Illegal", + }, + thundurus: { + isNonstandard: "Past", + tier: "Illegal", + }, + thundurustherian: { + isNonstandard: "Past", + tier: "Illegal", + }, + reshiram: { + isNonstandard: "Past", + tier: "Illegal", + }, + zekrom: { + isNonstandard: "Past", + tier: "Illegal", + }, + landorus: { + isNonstandard: "Past", + tier: "Illegal", + }, + landorustherian: { + isNonstandard: "Past", + tier: "Illegal", + }, + kyurem: { + isNonstandard: "Past", + tier: "Illegal", + }, + kyuremblack: { + isNonstandard: "Past", + tier: "Illegal", + }, + kyuremwhite: { + isNonstandard: "Past", + tier: "Illegal", + }, + keldeo: { + isNonstandard: "Past", + tier: "Illegal", + }, + meloetta: { + isNonstandard: "Past", + tier: "Illegal", + }, + genesect: { + isNonstandard: "Past", + tier: "Illegal", + }, + genesectburn: { + isNonstandard: "Past", + tier: "Illegal", + }, + genesectchill: { + isNonstandard: "Past", + tier: "Illegal", + }, + genesectdouse: { + isNonstandard: "Past", + tier: "Illegal", + }, + genesectshock: { + isNonstandard: "Past", + tier: "Illegal", + }, + chespin: { + isNonstandard: "Past", + tier: "Illegal", + }, + quilladin: { + isNonstandard: "Past", + tier: "Illegal", + }, + chesnaught: { + tier: "OU", + }, + chesnaughtmega: { + tier: "OU", + }, + fennekin: { + isNonstandard: "Past", + tier: "Illegal", + }, + braixen: { + isNonstandard: "Past", + tier: "Illegal", + }, + delphox: { + tier: "OU", + }, + delphoxmega: { + tier: "OU", + }, + froakie: { + isNonstandard: "Past", + tier: "Illegal", + }, + frogadier: { + isNonstandard: "Past", + tier: "Illegal", + }, + greninja: { + tier: "OU", + }, + greninjaash: { + isNonstandard: "Past", + tier: "Illegal", + }, + greninjabond: { + isNonstandard: "Past", + tier: "Illegal", + }, + greninjamega: { + tier: "OU", + }, + bunnelby: { + isNonstandard: "Past", + tier: "Illegal", + }, + diggersby: { + tier: "OU", + }, + fletchling: { + isNonstandard: "Past", + tier: "Illegal", + }, + fletchinder: { + isNonstandard: "Past", + tier: "Illegal", + }, + talonflame: { + tier: "OU", + }, + scatterbug: { + isNonstandard: "Past", + tier: "Illegal", + }, + spewpa: { + isNonstandard: "Past", + tier: "Illegal", + }, + vivillon: { + tier: "OU", + }, + litleo: { + isNonstandard: "Past", + tier: "Illegal", + }, + pyroar: { + isNonstandard: "Past", + tier: "Illegal", + }, + pyroarmega: { + isNonstandard: "Future", + tier: "Illegal", + }, + flabebe: { + isNonstandard: "Past", + tier: "Illegal", + }, + floette: { + isNonstandard: "Past", + tier: "Illegal", + }, + floetteeternal: { + tier: "OU", + }, + floettemega: { + tier: "OU", + }, + florges: { + tier: "OU", + }, + skiddo: { + isNonstandard: "Past", + tier: "Illegal", + }, + gogoat: { + isNonstandard: "Past", + tier: "Illegal", + }, + pancham: { + isNonstandard: "Past", + tier: "Illegal", + }, + pangoro: { + tier: "OU", + }, + furfrou: { + tier: "OU", + }, + espurr: { + isNonstandard: "Past", + tier: "Illegal", + }, + meowstic: { + tier: "OU", + }, + meowsticmmega: { + tier: "OU", + }, + meowsticfmega: { + tier: "OU", + }, + honedge: { + isNonstandard: "Past", + tier: "Illegal", + }, + doublade: { + isNonstandard: "Past", + tier: "Illegal", + }, + aegislash: { + tier: "OU", + }, + aegislashblade: { + isNonstandard: "Past", + }, + spritzee: { + isNonstandard: "Past", + tier: "Illegal", + }, + aromatisse: { + tier: "OU", + }, + swirlix: { + isNonstandard: "Past", + tier: "Illegal", + }, + slurpuff: { + tier: "OU", + }, + inkay: { + isNonstandard: "Past", + tier: "Illegal", + }, + malamar: { + isNonstandard: "Past", + tier: "Illegal", + }, + malamarmega: { + isNonstandard: "Future", + tier: "Illegal", + }, + binacle: { + isNonstandard: "Past", + tier: "Illegal", + }, + barbaracle: { + isNonstandard: "Past", + tier: "Illegal", + }, + barbaraclemega: { + isNonstandard: "Future", + tier: "Illegal", + }, + skrelp: { + isNonstandard: "Past", + tier: "Illegal", + }, + dragalge: { + isNonstandard: "Past", + tier: "Illegal", + }, + dragalgemega: { + isNonstandard: "Future", + tier: "Illegal", + }, + clauncher: { + isNonstandard: "Past", + tier: "Illegal", + }, + clawitzer: { + tier: "OU", + }, + helioptile: { + isNonstandard: "Past", + tier: "Illegal", + }, + heliolisk: { + tier: "OU", + }, + tyrunt: { + isNonstandard: "Past", + tier: "Illegal", + }, + tyrantrum: { + tier: "OU", + }, + amaura: { + isNonstandard: "Past", + tier: "Illegal", + }, + aurorus: { + tier: "OU", + }, + hawlucha: { + tier: "OU", + }, + hawluchamega: { + tier: "OU", + }, + dedenne: { + tier: "OU", + }, + carbink: { + isNonstandard: "Past", + tier: "Illegal", + }, + goomy: { + isNonstandard: "Past", + tier: "Illegal", + }, + sliggoo: { + isNonstandard: "Past", + tier: "Illegal", + }, + sliggoohisui: { + isNonstandard: "Past", + tier: "Illegal", + }, + goodra: { + tier: "OU", + }, + goodrahisui: { + tier: "OU", + }, + klefki: { + tier: "OU", + }, + phantump: { + isNonstandard: "Past", + tier: "Illegal", + }, + trevenant: { + tier: "OU", + }, + pumpkaboo: { + isNonstandard: "Past", + tier: "Illegal", + }, + pumpkaboosmall: { + isNonstandard: "Past", + }, + pumpkaboolarge: { + isNonstandard: "Past", + }, + pumpkaboosuper: { + isNonstandard: "Past", + }, + gourgeist: { + tier: "OU", + }, + gourgeistsmall: { + tier: "OU", + }, + gourgeistlarge: { + tier: "OU", + }, + gourgeistsuper: { + tier: "OU", + }, + bergmite: { + isNonstandard: "Past", + tier: "Illegal", + }, + avalugg: { + tier: "OU", + }, + avalugghisui: { + tier: "OU", + }, + noibat: { + isNonstandard: "Past", + tier: "Illegal", + }, + noivern: { + tier: "OU", + }, + xerneas: { + isNonstandard: "Past", + tier: "Illegal", + }, + xerneasneutral: { + isNonstandard: "Custom", // can't be used in battle + tier: "Illegal", + }, + yveltal: { + isNonstandard: "Past", + tier: "Illegal", + }, + zygarde: { + isNonstandard: "Past", + tier: "Illegal", + }, + zygarde10: { + isNonstandard: "Past", + tier: "Illegal", + }, + zygardecomplete: { + isNonstandard: "Past", + tier: "Illegal", + }, + zygardemega: { + isNonstandard: "Future", + tier: "Illegal", + }, + diancie: { + isNonstandard: "Past", + tier: "Illegal", + }, + dianciemega: { + isNonstandard: "Past", + tier: "Illegal", + }, + hoopa: { + isNonstandard: "Past", + tier: "Illegal", + }, + hoopaunbound: { + isNonstandard: "Past", + tier: "Illegal", + }, + volcanion: { + isNonstandard: "Past", + tier: "Illegal", + }, + rowlet: { + isNonstandard: "Past", + tier: "Illegal", + }, + dartrix: { + isNonstandard: "Past", + tier: "Illegal", + }, + decidueye: { + tier: "OU", + }, + decidueyehisui: { + tier: "OU", + }, + litten: { + isNonstandard: "Past", + tier: "Illegal", + }, + torracat: { + isNonstandard: "Past", + tier: "Illegal", + }, + incineroar: { + tier: "OU", + }, + popplio: { + isNonstandard: "Past", + tier: "Illegal", + }, + brionne: { + isNonstandard: "Past", + tier: "Illegal", + }, + primarina: { + tier: "OU", + }, + pikipek: { + isNonstandard: "Past", + tier: "Illegal", + }, + trumbeak: { + isNonstandard: "Past", + tier: "Illegal", + }, + toucannon: { + tier: "OU", + }, + yungoos: { + isNonstandard: "Past", + tier: "Illegal", + }, + gumshoos: { + isNonstandard: "Past", + tier: "Illegal", + }, + gumshoostotem: { + isNonstandard: "Past", + tier: "Illegal", + }, + grubbin: { + isNonstandard: "Past", + tier: "Illegal", + }, + charjabug: { + isNonstandard: "Past", + tier: "Illegal", + }, + vikavolt: { + isNonstandard: "Past", + tier: "Illegal", + }, + vikavolttotem: { + isNonstandard: "Past", + tier: "Illegal", + }, + crabrawler: { + isNonstandard: "Past", + tier: "Illegal", + }, + crabominable: { + tier: "OU", + }, + crabominablemega: { + tier: "OU", + }, + oricorio: { + isNonstandard: "Past", + tier: "Illegal", + }, + oricoriopompom: { + isNonstandard: "Past", + tier: "Illegal", + }, + oricoriopau: { + isNonstandard: "Past", + tier: "Illegal", + }, + oricoriosensu: { + isNonstandard: "Past", + tier: "Illegal", + }, + cutiefly: { + isNonstandard: "Past", + tier: "Illegal", + }, + ribombee: { + isNonstandard: "Past", + tier: "Illegal", + }, + ribombeetotem: { + isNonstandard: "Past", + tier: "Illegal", + }, + rockruff: { + isNonstandard: "Past", + tier: "Illegal", + }, + rockruffdusk: { + isNonstandard: "Past", + tier: "Illegal", + }, + lycanroc: { + tier: "OU", + }, + lycanrocmidnight: { + tier: "OU", + }, + lycanrocdusk: { + tier: "OU", + }, + wishiwashi: { + isNonstandard: "Past", + tier: "Illegal", + }, + wishiwashischool: { + isNonstandard: "Past", + }, + mareanie: { + isNonstandard: "Past", + tier: "Illegal", + }, + toxapex: { + tier: "OU", + }, + mudbray: { + isNonstandard: "Past", + tier: "Illegal", + }, + mudsdale: { + tier: "OU", + }, + dewpider: { + isNonstandard: "Past", + tier: "Illegal", + }, + araquanid: { + tier: "OU", + }, + araquanidtotem: { + isNonstandard: "Past", + tier: "Illegal", + }, + fomantis: { + isNonstandard: "Past", + tier: "Illegal", + }, + lurantis: { + isNonstandard: "Past", + tier: "Illegal", + }, + lurantistotem: { + isNonstandard: "Past", + tier: "Illegal", + }, + morelull: { + isNonstandard: "Past", + tier: "Illegal", + }, + shiinotic: { + isNonstandard: "Past", + tier: "Illegal", + }, + salandit: { + isNonstandard: "Past", + tier: "Illegal", + }, + salazzle: { + tier: "OU", + }, + salazzletotem: { + isNonstandard: "Past", + tier: "Illegal", + }, + stufful: { + isNonstandard: "Past", + tier: "Illegal", + }, + bewear: { + isNonstandard: "Past", + tier: "Illegal", + }, + bounsweet: { + isNonstandard: "Past", + tier: "Illegal", + }, + steenee: { + isNonstandard: "Past", + tier: "Illegal", + }, + tsareena: { + tier: "OU", + }, + comfey: { + isNonstandard: "Past", + tier: "Illegal", + }, + oranguru: { + tier: "OU", + }, + passimian: { + tier: "OU", + }, + wimpod: { + isNonstandard: "Past", + tier: "Illegal", + }, + golisopod: { + isNonstandard: "Past", + tier: "Illegal", + }, + golisopodmega: { + isNonstandard: "Future", + tier: "Illegal", + }, + sandygast: { + isNonstandard: "Past", + tier: "Illegal", + }, + palossand: { + isNonstandard: "Past", + tier: "Illegal", + }, + pyukumuku: { + isNonstandard: "Past", + tier: "Illegal", + }, + typenull: { + isNonstandard: "Past", + tier: "Illegal", + }, + silvally: { + isNonstandard: "Past", + tier: "Illegal", + }, + silvallybug: { + isNonstandard: "Past", + tier: "Illegal", + }, + silvallydark: { + isNonstandard: "Past", + tier: "Illegal", + }, + silvallydragon: { + isNonstandard: "Past", + tier: "Illegal", + }, + silvallyelectric: { + isNonstandard: "Past", + tier: "Illegal", + }, + silvallyfairy: { + isNonstandard: "Past", + tier: "Illegal", + }, + silvallyfighting: { + isNonstandard: "Past", + tier: "Illegal", + }, + silvallyfire: { + isNonstandard: "Past", + tier: "Illegal", + }, + silvallyflying: { + isNonstandard: "Past", + tier: "Illegal", + }, + silvallyghost: { + isNonstandard: "Past", + tier: "Illegal", + }, + silvallygrass: { + isNonstandard: "Past", + tier: "Illegal", + }, + silvallyground: { + isNonstandard: "Past", + tier: "Illegal", + }, + silvallyice: { + isNonstandard: "Past", + tier: "Illegal", + }, + silvallypoison: { + isNonstandard: "Past", + tier: "Illegal", + }, + silvallypsychic: { + isNonstandard: "Past", + tier: "Illegal", + }, + silvallyrock: { + isNonstandard: "Past", + tier: "Illegal", + }, + silvallysteel: { + isNonstandard: "Past", + tier: "Illegal", + }, + silvallywater: { + isNonstandard: "Past", + tier: "Illegal", + }, + minior: { + isNonstandard: "Past", + tier: "Illegal", + }, + komala: { + isNonstandard: "Past", + tier: "Illegal", + }, + turtonator: { + isNonstandard: "Past", + tier: "Illegal", + }, + togedemaru: { + isNonstandard: "Past", + tier: "Illegal", + }, + togedemarutotem: { + isNonstandard: "Past", + tier: "Illegal", + }, + mimikyu: { + tier: "OU", + }, + mimikyutotem: { + isNonstandard: "Past", + tier: "Illegal", + }, + mimikyubustedtotem: { + isNonstandard: "Past", + tier: "Illegal", + }, + bruxish: { + isNonstandard: "Past", + tier: "Illegal", + }, + drampa: { + tier: "OU", + }, + drampamega: { + tier: "OU", + }, + dhelmise: { + isNonstandard: "Past", + tier: "Illegal", + }, + jangmoo: { + isNonstandard: "Past", + tier: "Illegal", + }, + hakamoo: { + isNonstandard: "Past", + tier: "Illegal", + }, + kommoo: { + tier: "OU", + }, + kommoototem: { + isNonstandard: "Past", + tier: "Illegal", + }, + tapukoko: { + isNonstandard: "Past", + tier: "Illegal", + }, + tapulele: { + isNonstandard: "Past", + tier: "Illegal", + }, + tapubulu: { + isNonstandard: "Past", + tier: "Illegal", + }, + tapufini: { + isNonstandard: "Past", + tier: "Illegal", + }, + cosmog: { + isNonstandard: "Past", + tier: "Illegal", + }, + cosmoem: { + isNonstandard: "Past", + tier: "Illegal", + }, + solgaleo: { + isNonstandard: "Past", + tier: "Illegal", + }, + lunala: { + isNonstandard: "Past", + tier: "Illegal", + }, + nihilego: { + isNonstandard: "Past", + tier: "Illegal", + }, + buzzwole: { + isNonstandard: "Past", + tier: "Illegal", + }, + pheromosa: { + isNonstandard: "Past", + tier: "Illegal", + }, + xurkitree: { + isNonstandard: "Past", + tier: "Illegal", + }, + celesteela: { + isNonstandard: "Past", + tier: "Illegal", + }, + kartana: { + isNonstandard: "Past", + tier: "Illegal", + }, + guzzlord: { + isNonstandard: "Past", + tier: "Illegal", + }, + necrozma: { + isNonstandard: "Past", + tier: "Illegal", + }, + necrozmaduskmane: { + isNonstandard: "Past", + tier: "Illegal", + }, + necrozmadawnwings: { + isNonstandard: "Past", + tier: "Illegal", + }, + necrozmaultra: { + isNonstandard: "Past", + tier: "Illegal", + }, + magearna: { + isNonstandard: "Past", + tier: "Illegal", + }, + magearnamega: { + isNonstandard: "Future", + tier: "Illegal", + }, + magearnaoriginalmega: { + isNonstandard: "Future", + tier: "Illegal", + }, + marshadow: { + isNonstandard: "Past", + tier: "Illegal", + }, + poipole: { + isNonstandard: "Past", + tier: "Illegal", + }, + naganadel: { + isNonstandard: "Past", + tier: "Illegal", + }, + stakataka: { + isNonstandard: "Past", + tier: "Illegal", + }, + blacephalon: { + isNonstandard: "Past", + tier: "Illegal", + }, + zeraora: { + isNonstandard: "Past", + tier: "Illegal", + }, + zeraoramega: { + isNonstandard: "Future", + tier: "Illegal", + }, + meltan: { + isNonstandard: "Past", + tier: "Illegal", + }, + melmetal: { + isNonstandard: "Past", + tier: "Illegal", + }, + melmetalgmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + grookey: { + isNonstandard: "Past", + tier: "Illegal", + }, + thwackey: { + isNonstandard: "Past", + tier: "Illegal", + }, + rillaboom: { + isNonstandard: "Past", + tier: "Illegal", + }, + rillaboomgmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + scorbunny: { + isNonstandard: "Past", + tier: "Illegal", + }, + raboot: { + isNonstandard: "Past", + tier: "Illegal", + }, + cinderace: { + isNonstandard: "Past", + tier: "Illegal", + }, + cinderacegmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + sobble: { + isNonstandard: "Past", + tier: "Illegal", + }, + drizzile: { + isNonstandard: "Past", + tier: "Illegal", + }, + inteleon: { + isNonstandard: "Past", + tier: "Illegal", + }, + inteleongmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + skwovet: { + isNonstandard: "Past", + tier: "Illegal", + }, + greedent: { + isNonstandard: "Past", + tier: "Illegal", + }, + rookidee: { + isNonstandard: "Past", + tier: "Illegal", + }, + corvisquire: { + isNonstandard: "Past", + tier: "Illegal", + }, + corviknight: { + tier: "OU", + }, + corviknightgmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + blipbug: { + isNonstandard: "Past", + tier: "Illegal", + }, + dottler: { + isNonstandard: "Past", + tier: "Illegal", + }, + orbeetle: { + isNonstandard: "Past", + tier: "Illegal", + }, + orbeetlegmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + nickit: { + isNonstandard: "Past", + tier: "Illegal", + }, + thievul: { + isNonstandard: "Past", + tier: "Illegal", + }, + gossifleur: { + isNonstandard: "Past", + tier: "Illegal", + }, + eldegoss: { + isNonstandard: "Past", + tier: "Illegal", + }, + wooloo: { + isNonstandard: "Past", + tier: "Illegal", + }, + dubwool: { + isNonstandard: "Past", + tier: "Illegal", + }, + chewtle: { + isNonstandard: "Past", + tier: "Illegal", + }, + drednaw: { + isNonstandard: "Past", + tier: "Illegal", + }, + drednawgmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + yamper: { + isNonstandard: "Past", + tier: "Illegal", + }, + boltund: { + isNonstandard: "Past", + tier: "Illegal", + }, + rolycoly: { + isNonstandard: "Past", + tier: "Illegal", + }, + carkol: { + isNonstandard: "Past", + tier: "Illegal", + }, + coalossal: { + isNonstandard: "Past", + tier: "Illegal", + }, + coalossalgmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + applin: { + isNonstandard: "Past", + tier: "Illegal", + }, + flapple: { + tier: "OU", + }, + flapplegmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + appletun: { + tier: "OU", + }, + appletungmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + dipplin: { + isNonstandard: "Past", + tier: "Illegal", + }, + silicobra: { + isNonstandard: "Past", + tier: "Illegal", + }, + sandaconda: { + tier: "OU", + }, + sandacondagmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + cramorant: { + isNonstandard: "Past", + tier: "Illegal", + }, + arrokuda: { + isNonstandard: "Past", + tier: "Illegal", + }, + barraskewda: { + isNonstandard: "Past", + tier: "Illegal", + }, + toxel: { + isNonstandard: "Past", + tier: "Illegal", + }, + toxtricity: { + isNonstandard: "Past", + tier: "Illegal", + }, + toxtricitygmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + toxtricitylowkeygmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + sizzlipede: { + isNonstandard: "Past", + tier: "Illegal", + }, + centiskorch: { + isNonstandard: "Past", + tier: "Illegal", + }, + centiskorchgmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + clobbopus: { + isNonstandard: "Past", + tier: "Illegal", + }, + grapploct: { + isNonstandard: "Past", + tier: "Illegal", + }, + sinistea: { + isNonstandard: "Past", + tier: "Illegal", + }, + polteageist: { + tier: "OU", + }, + hatenna: { + isNonstandard: "Past", + tier: "Illegal", + }, + hattrem: { + isNonstandard: "Past", + tier: "Illegal", + }, + hatterene: { + tier: "OU", + }, + hatterenegmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + impidimp: { + isNonstandard: "Past", + tier: "Illegal", + }, + morgrem: { + isNonstandard: "Past", + tier: "Illegal", + }, + grimmsnarl: { + isNonstandard: "Past", + tier: "Illegal", + }, + grimmsnarlgmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + milcery: { + isNonstandard: "Past", + tier: "Illegal", + }, + alcremie: { + tier: "OU", + }, + alcremiegmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + falinks: { + isNonstandard: "Past", + tier: "Illegal", + }, + falinksmega: { + isNonstandard: "Future", + tier: "Illegal", + }, + pincurchin: { + isNonstandard: "Past", + tier: "Illegal", + }, + snom: { + isNonstandard: "Past", + tier: "Illegal", + }, + frosmoth: { + isNonstandard: "Past", + tier: "Illegal", + }, + stonjourner: { + isNonstandard: "Past", + tier: "Illegal", + }, + eiscue: { + isNonstandard: "Past", + tier: "Illegal", + }, + indeedee: { + isNonstandard: "Past", + tier: "Illegal", + }, + indeedeef: { + isNonstandard: "Past", + tier: "Illegal", + }, + morpeko: { + tier: "OU", + }, + cufant: { + isNonstandard: "Past", + tier: "Illegal", + }, + copperajah: { + isNonstandard: "Past", + tier: "Illegal", + }, + copperajahgmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + dracozolt: { + isNonstandard: "Past", + tier: "Illegal", + }, + arctozolt: { + isNonstandard: "Past", + tier: "Illegal", + }, + dracovish: { + isNonstandard: "Past", + tier: "Illegal", + }, + arctovish: { + isNonstandard: "Past", + tier: "Illegal", + }, + duraludon: { + isNonstandard: "Past", + tier: "Illegal", + }, + duraludongmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + dreepy: { + isNonstandard: "Past", + tier: "Illegal", + }, + drakloak: { + isNonstandard: "Past", + tier: "Illegal", + }, + dragapult: { + tier: "OU", + }, + zacian: { + isNonstandard: "Past", + tier: "Illegal", + }, + zaciancrowned: { + isNonstandard: "Past", + tier: "Illegal", + }, + zamazenta: { + isNonstandard: "Past", + tier: "Illegal", + }, + zamazentacrowned: { + isNonstandard: "Past", + tier: "Illegal", + }, + eternatus: { + isNonstandard: "Past", + tier: "Illegal", + }, + eternatuseternamax: { + isNonstandard: "Past", + tier: "Illegal", + }, + kubfu: { + isNonstandard: "Past", + tier: "Illegal", + }, + urshifu: { + isNonstandard: "Past", + tier: "Illegal", + }, + urshifurapidstrike: { + isNonstandard: "Past", + tier: "Illegal", + }, + urshifugmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + urshifurapidstrikegmax: { + isNonstandard: "Past", + tier: "Illegal", + }, + zarude: { + isNonstandard: "Past", + tier: "Illegal", + }, + regieleki: { + isNonstandard: "Past", + tier: "Illegal", + }, + regidrago: { + isNonstandard: "Past", + tier: "Illegal", + }, + glastrier: { + isNonstandard: "Past", + tier: "Illegal", + }, + spectrier: { + isNonstandard: "Past", + tier: "Illegal", + }, + calyrex: { + isNonstandard: "Past", + tier: "Illegal", + }, + calyrexice: { + isNonstandard: "Past", + tier: "Illegal", + }, + calyrexshadow: { + isNonstandard: "Past", + tier: "Illegal", + }, + enamorus: { + isNonstandard: "Past", + tier: "Illegal", + }, + enamorustherian: { + isNonstandard: "Past", + tier: "Illegal", + }, + sprigatito: { + isNonstandard: "Past", + tier: "Illegal", + }, + floragato: { + isNonstandard: "Past", + tier: "Illegal", + }, + meowscarada: { + tier: "OU", + }, + fuecoco: { + isNonstandard: "Past", + tier: "Illegal", + }, + crocalor: { + isNonstandard: "Past", + tier: "Illegal", + }, + skeledirge: { + tier: "OU", + }, + quaxly: { + isNonstandard: "Past", + tier: "Illegal", + }, + quaxwell: { + isNonstandard: "Past", + tier: "Illegal", + }, + quaquaval: { + tier: "OU", + }, + lechonk: { + isNonstandard: "Past", + tier: "Illegal", + }, + oinkologne: { + isNonstandard: "Past", + tier: "Illegal", + }, + oinkolognef: { + isNonstandard: "Past", + tier: "Illegal", + }, + tarountula: { + isNonstandard: "Past", + tier: "Illegal", + }, + spidops: { + isNonstandard: "Past", + tier: "Illegal", + }, + nymble: { + isNonstandard: "Past", + tier: "Illegal", + }, + lokix: { + isNonstandard: "Past", + tier: "Illegal", + }, + rellor: { + isNonstandard: "Past", + tier: "Illegal", + }, + rabsca: { + isNonstandard: "Past", + tier: "Illegal", + }, + greavard: { + isNonstandard: "Past", + tier: "Illegal", + }, + houndstone: { + isNonstandard: "Past", + tier: "Illegal", + }, + flittle: { + isNonstandard: "Past", + tier: "Illegal", + }, + espathra: { + tier: "OU", + }, + wiglett: { + isNonstandard: "Past", + tier: "Illegal", + }, + wugtrio: { + isNonstandard: "Past", + tier: "Illegal", + }, + dondozo: { + isNonstandard: "Past", + tier: "Illegal", + }, + veluza: { + isNonstandard: "Past", + tier: "Illegal", + }, + finizen: { + isNonstandard: "Past", + tier: "Illegal", + }, + palafin: { + tier: "OU", + }, + smoliv: { + isNonstandard: "Past", + tier: "Illegal", + }, + dolliv: { + isNonstandard: "Past", + tier: "Illegal", + }, + arboliva: { + isNonstandard: "Past", + tier: "Illegal", + }, + capsakid: { + isNonstandard: "Past", + tier: "Illegal", + }, + scovillain: { + tier: "OU", + }, + scovillainmega: { + tier: "OU", + }, + tadbulb: { + isNonstandard: "Past", + tier: "Illegal", + }, + bellibolt: { + tier: "OU", + }, + varoom: { + isNonstandard: "Past", + tier: "Illegal", + }, + revavroom: { + isNonstandard: "Past", + tier: "Illegal", + }, + orthworm: { + tier: "OU", + }, + tandemaus: { + isNonstandard: "Past", + tier: "Illegal", + }, + maushold: { + tier: "OU", + }, + cetoddle: { + isNonstandard: "Past", + tier: "Illegal", + }, + cetitan: { + isNonstandard: "Past", + tier: "Illegal", + }, + frigibax: { + isNonstandard: "Past", + tier: "Illegal", + }, + arctibax: { + isNonstandard: "Past", + tier: "Illegal", + }, + baxcalibur: { + isNonstandard: "Past", + tier: "Illegal", + }, + baxcaliburmega: { + isNonstandard: "Future", + tier: "Illegal", + }, + tatsugiri: { + isNonstandard: "Past", + tier: "Illegal", + }, + tatsugiricurlymega: { + isNonstandard: "Future", + tier: "Illegal", + }, + tatsugiridroopymega: { + isNonstandard: "Future", + tier: "Illegal", + }, + tatsugiristretchymega: { + isNonstandard: "Future", + tier: "Illegal", + }, + cyclizar: { + isNonstandard: "Past", + tier: "Illegal", + }, + pawmi: { + isNonstandard: "Past", + tier: "Illegal", + }, + pawmo: { + isNonstandard: "Past", + tier: "Illegal", + }, + pawmot: { + isNonstandard: "Past", + tier: "Illegal", + }, + wattrel: { + isNonstandard: "Past", + tier: "Illegal", + }, + kilowattrel: { + isNonstandard: "Past", + tier: "Illegal", + }, + bombirdier: { + isNonstandard: "Past", + tier: "Illegal", + }, + squawkabilly: { + isNonstandard: "Past", + tier: "Illegal", + }, + flamigo: { + isNonstandard: "Past", + tier: "Illegal", + }, + klawf: { + isNonstandard: "Past", + tier: "Illegal", + }, + nacli: { + isNonstandard: "Past", + tier: "Illegal", + }, + naclstack: { + isNonstandard: "Past", + tier: "Illegal", + }, + garganacl: { + tier: "OU", + }, + glimmet: { + isNonstandard: "Past", + tier: "Illegal", + }, + glimmora: { + tier: "OU", + }, + glimmoramega: { + tier: "OU", + }, + shroodle: { + isNonstandard: "Past", + tier: "Illegal", + }, + grafaiai: { + isNonstandard: "Past", + tier: "Illegal", + }, + fidough: { + isNonstandard: "Past", + tier: "Illegal", + }, + dachsbun: { + isNonstandard: "Past", + tier: "Illegal", + }, + maschiff: { + isNonstandard: "Past", + tier: "Illegal", + }, + mabosstiff: { + isNonstandard: "Past", + tier: "Illegal", + }, + bramblin: { + isNonstandard: "Past", + tier: "Illegal", + }, + brambleghast: { + isNonstandard: "Past", + tier: "Illegal", + }, + gimmighoul: { + isNonstandard: "Past", + tier: "Illegal", + }, + gimmighoulroaming: { + isNonstandard: "Past", + tier: "Illegal", + }, + gholdengo: { + isNonstandard: "Past", + tier: "Illegal", + }, + greattusk: { + isNonstandard: "Past", + tier: "Illegal", + }, + brutebonnet: { + isNonstandard: "Past", + tier: "Illegal", + }, + sandyshocks: { + isNonstandard: "Past", + tier: "Illegal", + }, + screamtail: { + isNonstandard: "Past", + tier: "Illegal", + }, + fluttermane: { + isNonstandard: "Past", + tier: "Illegal", + }, + slitherwing: { + isNonstandard: "Past", + tier: "Illegal", + }, + roaringmoon: { + isNonstandard: "Past", + tier: "Illegal", + }, + irontreads: { + isNonstandard: "Past", + tier: "Illegal", + }, + ironmoth: { + isNonstandard: "Past", + tier: "Illegal", + }, + ironhands: { + isNonstandard: "Past", + tier: "Illegal", + }, + ironjugulis: { + isNonstandard: "Past", + tier: "Illegal", + }, + ironthorns: { + isNonstandard: "Past", + tier: "Illegal", + }, + ironbundle: { + isNonstandard: "Past", + tier: "Illegal", + }, + ironvaliant: { + isNonstandard: "Past", + tier: "Illegal", + }, + tinglu: { + isNonstandard: "Past", + tier: "Illegal", + }, + chienpao: { + isNonstandard: "Past", + tier: "Illegal", + }, + wochien: { + isNonstandard: "Past", + tier: "Illegal", + }, + chiyu: { + isNonstandard: "Past", + tier: "Illegal", + }, + koraidon: { + isNonstandard: "Past", + tier: "Illegal", + }, + miraidon: { + isNonstandard: "Past", + tier: "Illegal", + }, + tinkatink: { + isNonstandard: "Past", + tier: "Illegal", + }, + tinkatuff: { + isNonstandard: "Past", + tier: "Illegal", + }, + tinkaton: { + tier: "OU", + }, + charcadet: { + isNonstandard: "Past", + tier: "Illegal", + }, + armarouge: { + tier: "OU", + }, + ceruledge: { + tier: "OU", + }, + toedscool: { + isNonstandard: "Past", + tier: "Illegal", + }, + toedscruel: { + isNonstandard: "Past", + tier: "Illegal", + }, + kingambit: { + tier: "OU", + }, + clodsire: { + isNonstandard: "Past", + tier: "Illegal", + }, + annihilape: { + isNonstandard: "Past", + tier: "Illegal", + }, + walkingwake: { + isNonstandard: "Past", + tier: "Illegal", + }, + ironleaves: { + isNonstandard: "Past", + tier: "Illegal", + }, + poltchageist: { + isNonstandard: "Past", + tier: "Illegal", + }, + sinistcha: { + tier: "OU", + }, + okidogi: { + isNonstandard: "Past", + tier: "Illegal", + }, + munkidori: { + isNonstandard: "Past", + tier: "Illegal", + }, + fezandipiti: { + isNonstandard: "Past", + tier: "Illegal", + }, + ogerpon: { + isNonstandard: "Past", + tier: "Illegal", + }, + ogerponwellspring: { + isNonstandard: "Past", + tier: "Illegal", + }, + ogerponhearthflame: { + isNonstandard: "Past", + tier: "Illegal", + }, + ogerponcornerstone: { + isNonstandard: "Past", + tier: "Illegal", + }, + archaludon: { + tier: "OU", + }, + hydrapple: { + tier: "OU", + }, + gougingfire: { + isNonstandard: "Past", + tier: "Illegal", + }, + ragingbolt: { + isNonstandard: "Past", + tier: "Illegal", + }, + ironboulder: { + isNonstandard: "Past", + tier: "Illegal", + }, + ironcrown: { + isNonstandard: "Past", + tier: "Illegal", + }, + terapagos: { + isNonstandard: "Past", + tier: "Illegal", + }, + terapagosstellar: { + isNonstandard: "Past", + tier: "Illegal", + }, + pecharunt: { + isNonstandard: "Past", + tier: "Illegal", + }, +}; diff --git a/data/mods/champions/items.ts b/data/mods/champions/items.ts new file mode 100644 index 0000000000..a18c7f004c --- /dev/null +++ b/data/mods/champions/items.ts @@ -0,0 +1,1053 @@ +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { + abilityshield: { + inherit: true, + isNonstandard: "Past", + }, + abomasite: { + inherit: true, + isNonstandard: null, + }, + absolite: { + inherit: true, + isNonstandard: null, + }, + absorbbulb: { + inherit: true, + isNonstandard: "Past", + }, + adamantcrystal: { + inherit: true, + isNonstandard: "Past", + }, + adamantorb: { + inherit: true, + isNonstandard: "Past", + }, + adrenalineorb: { + inherit: true, + isNonstandard: "Past", + }, + aerodactylite: { + inherit: true, + isNonstandard: null, + }, + aggronite: { + inherit: true, + isNonstandard: null, + }, + aguavberry: { + inherit: true, + isNonstandard: "Past", + }, + airballoon: { + inherit: true, + isNonstandard: "Past", + }, + alakazite: { + inherit: true, + isNonstandard: null, + }, + altarianite: { + inherit: true, + isNonstandard: null, + }, + ampharosite: { + inherit: true, + isNonstandard: null, + }, + apicotberry: { + inherit: true, + isNonstandard: "Past", + }, + assaultvest: { + inherit: true, + isNonstandard: "Past", + }, + audinite: { + inherit: true, + isNonstandard: null, + }, + auspiciousarmor: { + inherit: true, + isNonstandard: "Past", + }, + banettite: { + inherit: true, + isNonstandard: null, + }, + beastball: { + inherit: true, + isNonstandard: "Past", + }, + beedrillite: { + inherit: true, + isNonstandard: null, + }, + berrysweet: { + inherit: true, + isNonstandard: "Past", + }, + bignugget: { + inherit: true, + isNonstandard: "Past", + }, + bigroot: { + inherit: true, + isNonstandard: "Past", + }, + bindingband: { + inherit: true, + isNonstandard: "Past", + }, + blacksludge: { + inherit: true, + isNonstandard: "Past", + }, + blastoisinite: { + inherit: true, + isNonstandard: null, + }, + blunderpolicy: { + inherit: true, + isNonstandard: "Past", + }, + boosterenergy: { + inherit: true, + isNonstandard: "Past", + }, + bottlecap: { + inherit: true, + isNonstandard: "Past", + }, + cameruptite: { + inherit: true, + isNonstandard: null, + }, + cellbattery: { + inherit: true, + isNonstandard: "Past", + }, + chandelurite: { + inherit: true, + isNonstandard: null, + }, + charizarditex: { + inherit: true, + isNonstandard: null, + }, + charizarditey: { + inherit: true, + isNonstandard: null, + }, + chesnaughtite: { + inherit: true, + isNonstandard: null, + }, + chimechite: { + inherit: true, + isNonstandard: null, + }, + chippedpot: { + inherit: true, + isNonstandard: "Past", + }, + choiceband: { + inherit: true, + isNonstandard: "Past", + }, + choicespecs: { + inherit: true, + isNonstandard: "Past", + }, + clearamulet: { + inherit: true, + isNonstandard: "Past", + }, + clefablite: { + inherit: true, + isNonstandard: null, + }, + cloversweet: { + inherit: true, + isNonstandard: "Past", + }, + cornerstonemask: { + inherit: true, + isNonstandard: "Past", + }, + covertcloak: { + inherit: true, + isNonstandard: "Past", + }, + crabominite: { + inherit: true, + isNonstandard: null, + }, + crackedpot: { + inherit: true, + isNonstandard: "Past", + }, + custapberry: { + inherit: true, + isNonstandard: "Past", + }, + damprock: { + inherit: true, + isNonstandard: "Past", + }, + darkranite: { + inherit: true, + isNonstandard: "Past", + }, + dawnstone: { + inherit: true, + isNonstandard: "Past", + }, + delphoxite: { + inherit: true, + isNonstandard: null, + }, + destinyknot: { + inherit: true, + isNonstandard: "Past", + }, + diveball: { + inherit: true, + isNonstandard: "Past", + }, + dracoplate: { + inherit: true, + isNonstandard: "Past", + }, + dragalgite: { + inherit: true, + isNonstandard: "Past", + }, + dragoninite: { + inherit: true, + isNonstandard: null, + }, + dragonscale: { + inherit: true, + isNonstandard: "Past", + }, + drampanite: { + inherit: true, + isNonstandard: null, + }, + dreadplate: { + inherit: true, + isNonstandard: "Past", + }, + dreamball: { + inherit: true, + isNonstandard: "Past", + }, + dubiousdisc: { + inherit: true, + isNonstandard: "Past", + }, + duskball: { + inherit: true, + isNonstandard: "Past", + }, + duskstone: { + inherit: true, + isNonstandard: "Past", + }, + earthplate: { + inherit: true, + isNonstandard: "Past", + }, + eelektrossite: { + inherit: true, + isNonstandard: "Past", + }, + ejectbutton: { + inherit: true, + isNonstandard: "Past", + }, + ejectpack: { + inherit: true, + isNonstandard: "Past", + }, + electirizer: { + inherit: true, + isNonstandard: "Past", + }, + electricseed: { + inherit: true, + isNonstandard: "Past", + }, + emboarite: { + inherit: true, + isNonstandard: null, + }, + enigmaberry: { + inherit: true, + isNonstandard: "Past", + }, + eviolite: { + inherit: true, + isNonstandard: "Past", + }, + excadrite: { + inherit: true, + isNonstandard: null, + }, + expertbelt: { + inherit: true, + isNonstandard: "Past", + }, + falinksite: { + inherit: true, + isNonstandard: "Past", + }, + fastball: { + inherit: true, + isNonstandard: "Past", + }, + feraligite: { + inherit: true, + isNonstandard: null, + }, + figyberry: { + inherit: true, + isNonstandard: "Past", + }, + firestone: { + inherit: true, + isNonstandard: "Past", + }, + fistplate: { + inherit: true, + isNonstandard: "Past", + }, + flameorb: { + inherit: true, + isNonstandard: "Past", + }, + flameplate: { + inherit: true, + isNonstandard: "Past", + }, + floatstone: { + inherit: true, + isNonstandard: "Past", + }, + floettite: { + inherit: true, + isNonstandard: null, + }, + flowersweet: { + inherit: true, + isNonstandard: "Past", + }, + friendball: { + inherit: true, + isNonstandard: "Past", + }, + froslassite: { + inherit: true, + isNonstandard: null, + }, + galaricacuff: { + inherit: true, + isNonstandard: "Past", + }, + galaricawreath: { + inherit: true, + isNonstandard: "Past", + }, + galladite: { + inherit: true, + isNonstandard: null, + }, + ganlonberry: { + inherit: true, + isNonstandard: "Past", + }, + garchompite: { + inherit: true, + isNonstandard: null, + }, + gardevoirite: { + inherit: true, + isNonstandard: null, + }, + gengarite: { + inherit: true, + isNonstandard: null, + }, + glalitite: { + inherit: true, + isNonstandard: null, + }, + glimmoranite: { + inherit: true, + isNonstandard: null, + }, + goldbottlecap: { + inherit: true, + isNonstandard: "Past", + }, + golisopite: { + inherit: true, + isNonstandard: "Past", + }, + golurkite: { + inherit: true, + isNonstandard: null, + }, + grassyseed: { + inherit: true, + isNonstandard: "Past", + }, + greatball: { + inherit: true, + isNonstandard: "Past", + }, + greninjite: { + inherit: true, + isNonstandard: null, + }, + grepaberry: { + inherit: true, + isNonstandard: "Past", + }, + gripclaw: { + inherit: true, + isNonstandard: "Past", + }, + griseouscore: { + inherit: true, + isNonstandard: "Past", + }, + griseousorb: { + inherit: true, + isNonstandard: "Past", + }, + gyaradosite: { + inherit: true, + isNonstandard: null, + }, + hawluchanite: { + inherit: true, + isNonstandard: null, + }, + healball: { + inherit: true, + isNonstandard: "Past", + }, + hearthflamemask: { + inherit: true, + isNonstandard: "Past", + }, + heatranite: { + inherit: true, + isNonstandard: "Past", + }, + heatrock: { + inherit: true, + isNonstandard: "Past", + }, + heavyball: { + inherit: true, + isNonstandard: "Past", + }, + heavydutyboots: { + inherit: true, + isNonstandard: "Past", + }, + heracronite: { + inherit: true, + isNonstandard: null, + }, + hondewberry: { + inherit: true, + isNonstandard: "Past", + }, + houndoominite: { + inherit: true, + isNonstandard: null, + }, + iapapaberry: { + inherit: true, + isNonstandard: "Past", + }, + icestone: { + inherit: true, + isNonstandard: "Past", + }, + icicleplate: { + inherit: true, + isNonstandard: "Past", + }, + icyrock: { + inherit: true, + isNonstandard: "Past", + }, + insectplate: { + inherit: true, + isNonstandard: "Past", + }, + ironball: { + inherit: true, + isNonstandard: "Past", + }, + ironplate: { + inherit: true, + isNonstandard: "Past", + }, + jabocaberry: { + inherit: true, + isNonstandard: "Past", + }, + kangaskhanite: { + inherit: true, + isNonstandard: null, + }, + keeberry: { + inherit: true, + isNonstandard: "Past", + }, + kelpsyberry: { + inherit: true, + isNonstandard: "Past", + }, + laggingtail: { + inherit: true, + isNonstandard: "Past", + }, + lansatberry: { + inherit: true, + isNonstandard: "Past", + }, + leafstone: { + inherit: true, + isNonstandard: "Past", + }, + levelball: { + inherit: true, + isNonstandard: "Past", + }, + liechiberry: { + inherit: true, + isNonstandard: "Past", + }, + lifeorb: { + inherit: true, + isNonstandard: "Past", + }, + lightclay: { + inherit: true, + isNonstandard: "Past", + }, + loadeddice: { + inherit: true, + isNonstandard: "Past", + }, + lopunnite: { + inherit: true, + isNonstandard: null, + }, + loveball: { + inherit: true, + isNonstandard: "Past", + }, + lovesweet: { + inherit: true, + isNonstandard: "Past", + }, + lucarionite: { + inherit: true, + isNonstandard: null, + }, + luminousmoss: { + inherit: true, + isNonstandard: "Past", + }, + lureball: { + inherit: true, + isNonstandard: "Past", + }, + lustrousglobe: { + inherit: true, + isNonstandard: "Past", + }, + lustrousorb: { + inherit: true, + isNonstandard: "Past", + }, + luxuryball: { + inherit: true, + isNonstandard: "Past", + }, + magmarizer: { + inherit: true, + isNonstandard: "Past", + }, + magoberry: { + inherit: true, + isNonstandard: "Past", + }, + maliciousarmor: { + inherit: true, + isNonstandard: "Past", + }, + manectite: { + inherit: true, + isNonstandard: null, + }, + marangaberry: { + inherit: true, + isNonstandard: "Past", + }, + masterball: { + inherit: true, + isNonstandard: "Past", + }, + masterpieceteacup: { + inherit: true, + isNonstandard: "Past", + }, + meadowplate: { + inherit: true, + isNonstandard: "Past", + }, + medichamite: { + inherit: true, + isNonstandard: null, + }, + meganiumite: { + inherit: true, + isNonstandard: null, + }, + meowsticite: { + inherit: true, + isNonstandard: null, + }, + metalalloy: { + inherit: true, + isNonstandard: "Past", + }, + metronome: { + inherit: true, + isNonstandard: "Past", + }, + micleberry: { + inherit: true, + isNonstandard: "Past", + }, + mindplate: { + inherit: true, + isNonstandard: "Past", + }, + mirrorherb: { + inherit: true, + isNonstandard: "Past", + }, + mistyseed: { + inherit: true, + isNonstandard: "Past", + }, + moonball: { + inherit: true, + isNonstandard: "Past", + }, + moonstone: { + inherit: true, + isNonstandard: "Past", + }, + muscleband: { + inherit: true, + isNonstandard: "Past", + }, + nestball: { + inherit: true, + isNonstandard: "Past", + }, + netball: { + inherit: true, + isNonstandard: "Past", + }, + normalgem: { + inherit: true, + isNonstandard: "Past", + }, + ovalstone: { + inherit: true, + isNonstandard: "Past", + }, + parkball: { + inherit: true, + isNonstandard: "Past", + }, + petayaberry: { + inherit: true, + isNonstandard: "Past", + }, + pidgeotite: { + inherit: true, + isNonstandard: null, + }, + pinsirite: { + inherit: true, + isNonstandard: null, + }, + pixieplate: { + inherit: true, + isNonstandard: "Past", + }, + pokeball: { + inherit: true, + isNonstandard: "Past", + }, + pomegberry: { + inherit: true, + isNonstandard: "Past", + }, + poweranklet: { + inherit: true, + isNonstandard: "Past", + }, + powerband: { + inherit: true, + isNonstandard: "Past", + }, + powerbelt: { + inherit: true, + isNonstandard: "Past", + }, + powerbracer: { + inherit: true, + isNonstandard: "Past", + }, + powerherb: { + inherit: true, + isNonstandard: "Past", + }, + powerlens: { + inherit: true, + isNonstandard: "Past", + }, + powerweight: { + inherit: true, + isNonstandard: "Past", + }, + premierball: { + inherit: true, + isNonstandard: "Past", + }, + prettyfeather: { + inherit: true, + isNonstandard: "Past", + }, + prismscale: { + inherit: true, + isNonstandard: "Past", + }, + protectivepads: { + inherit: true, + isNonstandard: "Past", + }, + protector: { + inherit: true, + isNonstandard: "Past", + }, + psychicseed: { + inherit: true, + isNonstandard: "Past", + }, + punchingglove: { + inherit: true, + isNonstandard: "Past", + }, + qualotberry: { + inherit: true, + isNonstandard: "Past", + }, + quickball: { + inherit: true, + isNonstandard: "Past", + }, + rarebone: { + inherit: true, + isNonstandard: "Past", + }, + razorclaw: { + inherit: true, + isNonstandard: "Past", + }, + razorfang: { + inherit: true, + isNonstandard: "Past", + }, + reapercloth: { + inherit: true, + isNonstandard: "Past", + }, + redcard: { + inherit: true, + isNonstandard: "Past", + }, + repeatball: { + inherit: true, + isNonstandard: "Past", + }, + ribbonsweet: { + inherit: true, + isNonstandard: "Past", + }, + ringtarget: { + inherit: true, + isNonstandard: "Past", + }, + rockyhelmet: { + inherit: true, + isNonstandard: "Past", + }, + roomservice: { + inherit: true, + isNonstandard: "Past", + }, + rowapberry: { + inherit: true, + isNonstandard: "Past", + }, + rustedshield: { + inherit: true, + isNonstandard: "Past", + }, + rustedsword: { + inherit: true, + isNonstandard: "Past", + }, + sablenite: { + inherit: true, + isNonstandard: null, + }, + safariball: { + inherit: true, + isNonstandard: "Past", + }, + safetygoggles: { + inherit: true, + isNonstandard: "Past", + }, + salacberry: { + inherit: true, + isNonstandard: "Past", + }, + scizorite: { + inherit: true, + isNonstandard: null, + }, + scovillainite: { + inherit: true, + isNonstandard: null, + }, + sharpedonite: { + inherit: true, + isNonstandard: null, + }, + shedshell: { + inherit: true, + isNonstandard: "Past", + }, + shinystone: { + inherit: true, + isNonstandard: "Past", + }, + skarmorite: { + inherit: true, + isNonstandard: null, + }, + skyplate: { + inherit: true, + isNonstandard: "Past", + }, + slowbronite: { + inherit: true, + isNonstandard: null, + }, + smoothrock: { + inherit: true, + isNonstandard: "Past", + }, + snowball: { + inherit: true, + isNonstandard: "Past", + }, + souldew: { + inherit: true, + isNonstandard: "Past", + }, + spelltag: { + inherit: true, + isNonstandard: null, + }, + splashplate: { + inherit: true, + isNonstandard: "Past", + }, + spookyplate: { + inherit: true, + isNonstandard: "Past", + }, + sportball: { + inherit: true, + isNonstandard: "Past", + }, + starfberry: { + inherit: true, + isNonstandard: "Past", + }, + starminite: { + inherit: true, + isNonstandard: null, + }, + starsweet: { + inherit: true, + isNonstandard: "Past", + }, + steelixite: { + inherit: true, + isNonstandard: null, + }, + stickybarb: { + inherit: true, + isNonstandard: "Past", + }, + stoneplate: { + inherit: true, + isNonstandard: "Past", + }, + strangeball: { + inherit: true, + isNonstandard: "Past", + }, + strawberrysweet: { + inherit: true, + isNonstandard: "Past", + }, + sunstone: { + inherit: true, + isNonstandard: "Past", + }, + sweetapple: { + inherit: true, + isNonstandard: "Past", + }, + syrupyapple: { + inherit: true, + isNonstandard: "Past", + }, + tamatoberry: { + inherit: true, + isNonstandard: "Past", + }, + tartapple: { + inherit: true, + isNonstandard: "Past", + }, + terrainextender: { + inherit: true, + isNonstandard: "Past", + }, + throatspray: { + inherit: true, + isNonstandard: "Past", + }, + thunderstone: { + inherit: true, + isNonstandard: "Past", + }, + timerball: { + inherit: true, + isNonstandard: "Past", + }, + toxicorb: { + inherit: true, + isNonstandard: "Past", + }, + toxicplate: { + inherit: true, + isNonstandard: "Past", + }, + tyranitarite: { + inherit: true, + isNonstandard: null, + }, + ultraball: { + inherit: true, + isNonstandard: "Past", + }, + unremarkableteacup: { + inherit: true, + isNonstandard: "Past", + }, + upgrade: { + inherit: true, + isNonstandard: "Past", + }, + utilityumbrella: { + inherit: true, + isNonstandard: "Past", + }, + venusaurite: { + inherit: true, + isNonstandard: null, + }, + victreebelite: { + inherit: true, + isNonstandard: null, + }, + waterstone: { + inherit: true, + isNonstandard: "Past", + }, + weaknesspolicy: { + inherit: true, + isNonstandard: "Past", + }, + wellspringmask: { + inherit: true, + isNonstandard: "Past", + }, + whiteherb: { + inherit: true, + onAnyAfterMove() { + // Desync: proceed from Parting Shot's point of view + this.queue.insertChoice({ + choice: 'event', + event: 'WhiteHerb', + order: 99, // before switches + pokemon: this.effectState.target, + }); + }, + onWhiteHerb(pokemon) { + ((this.effect as any).onStart as (p: Pokemon) => void).call(this, this.effectState.target); + }, + }, + widelens: { + inherit: true, + isNonstandard: "Past", + }, + wikiberry: { + inherit: true, + isNonstandard: "Past", + }, + wiseglasses: { + inherit: true, + isNonstandard: "Past", + }, + zapplate: { + inherit: true, + isNonstandard: "Past", + }, + zoomlens: { + inherit: true, + isNonstandard: "Past", + }, +}; diff --git a/data/mods/champions/learnsets.ts b/data/mods/champions/learnsets.ts new file mode 100644 index 0000000000..622a4184da --- /dev/null +++ b/data/mods/champions/learnsets.ts @@ -0,0 +1,13451 @@ +export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTable = { + venusaur: { + learnset: { + acidspray: ["9M"], + amnesia: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + bulletseed: ["9M"], + charm: ["9M"], + curse: ["9M"], + doubleedge: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + frenzyplant: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + grassyterrain: ["9M"], + growth: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + ingrain: ["9M"], + knockoff: ["9M"], + leafstorm: ["9M"], + leechseed: ["9M"], + lightscreen: ["9M"], + outrage: ["9M"], + petalblizzard: ["9M"], + petaldance: ["9M"], + poisonjab: ["9M"], + poisonpowder: ["9M"], + powerwhip: ["9M"], + protect: ["9M"], + roar: ["9M"], + rest: ["9M"], + round: ["9M"], + scaryface: ["9M"], + seedbomb: ["9M"], + sleeppowder: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + sludgewave: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + sweetscent: ["9M"], + swordsdance: ["9M"], + synthesis: ["9M"], + terrainpulse: ["9M"], + toxic: ["9M"], + trailblaze: ["9M"], + venoshock: ["9M"], + weatherball: ["9M"], + worryseed: ["9M"], + }, + }, + charizard: { + learnset: { + acrobatics: ["9M"], + aerialace: ["9M"], + aircutter: ["9M"], + airslash: ["9M"], + ancientpower: ["9M"], + beatup: ["9M"], + bellydrum: ["9M"], + bite: ["9M"], + blastburn: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + counter: ["9M"], + crunch: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + dragoncheer: ["9M"], + dragonclaw: ["9M"], + dragondance: ["9M"], + dragonpulse: ["9M"], + dragonrush: ["9M"], + dragontail: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firefang: ["9M"], + firepunch: ["9M"], + firespin: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + fling: ["9M"], + fly: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + heatcrash: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + hurricane: ["9M"], + hyperbeam: ["9M"], + inferno: ["9M"], + irontail: ["9M"], + megakick: ["9M"], + outrage: ["9M"], + overheat: ["9M"], + protect: ["9M"], + rest: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + roost: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scaleshot: ["9M"], + scaryface: ["9M"], + scorchingsands: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + steelwing: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + temperflare: ["9M"], + thunderpunch: ["9M"], + weatherball: ["9M"], + willowisp: ["9M"], + }, + }, + blastoise: { + learnset: { + aquajet: ["9M"], + aquaring: ["9M"], + aquatail: ["9M"], + aurasphere: ["9M"], + avalanche: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + bodypress: ["9M"], + bulldoze: ["9M"], + brickbreak: ["9M"], + bodyslam: ["9M"], + chillingwater: ["9M"], + crunch: ["9M"], + darkpulse: ["9M"], + dig: ["9M"], + dive: ["9M"], + doubleedge: ["9M"], + dragonpulse: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + flail: ["9M"], + flashcannon: ["9M"], + fling: ["9M"], + flipturn: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + gyroball: ["9M"], + haze: ["9M"], + helpinghand: ["9M"], + hydrocannon: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icepunch: ["9M"], + icespinner: ["9M"], + icywind: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + lifedew: ["9M"], + liquidation: ["9M"], + megakick: ["9M"], + mirrorcoat: ["9M"], + mudshot: ["9M"], + muddywater: ["9M"], + outrage: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rapidspin: ["9M"], + rest: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scaryface: ["9M"], + shellsmash: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + substitute: ["9M"], + surf: ["9M"], + terrainpulse: ["9M"], + waterpulse: ["9M"], + waterspout: ["9M"], + waterfall: ["9M"], + wavecrash: ["9M"], + weatherball: ["9M"], + whirlpool: ["9M"], + yawn: ["9M"], + zenheadbutt: ["9M"], + }, + }, + beedrill: { + learnset: { + acrobatics: ["9M"], + aerialace: ["9M"], + agility: ["9M"], + aircutter: ["9M"], + assurance: ["9M"], + attract: ["9M"], + batonpass: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bugbite: ["9M"], + bugbuzz: ["9M"], + crosspoison: ["9M"], + doublehit: ["9M"], + doubleedge: ["9M"], + drillrun: ["9M"], + dualwingbeat: ["9M"], + electroweb: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fellstinger: ["9M"], + focusenergy: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + hyperbeam: ["9M"], + irondefense: ["9M"], + knockoff: ["9M"], + lunge: ["9M"], + payback: ["9M"], + pinmissile: ["9M"], + poisonjab: ["9M"], + pollenpuff: ["9M"], + pounce: ["9M"], + protect: ["9M"], + rest: ["9M"], + round: ["9M"], + screech: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + stringshot: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + toxic: ["9M"], + toxicspikes: ["9M"], + uturn: ["9M"], + venoshock: ["9M"], + xscissor: ["9M"], + }, + }, + pidgeot: { + learnset: { + aerialace: ["9M"], + agility: ["9M"], + airslash: ["9M"], + attract: ["9M"], + bravebird: ["9M"], + dualwingbeat: ["9M"], + endure: ["9M"], + facade: ["9M"], + featherdance: ["9M"], + fly: ["9M"], + gigaimpact: ["9M"], + heatwave: ["9M"], + hurricane: ["9M"], + hyperbeam: ["9M"], + quickattack: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roost: ["9M"], + round: ["9M"], + skyattack: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + steelwing: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + tailwind: ["9M"], + thief: ["9M"], + uturn: ["9M"], + uproar: ["9M"], + whirlwind: ["9M"], + }, + }, + arbok: { + learnset: { + acidspray: ["9M"], + beatup: ["9M"], + belch: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + coil: ["9M"], + crunch: ["9M"], + darkpulse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + dragontail: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + firefang: ["9M"], + gastroacid: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + glare: ["9M"], + gunkshot: ["9M"], + haze: ["9M"], + hyperbeam: ["9M"], + icefang: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + lashout: ["9M"], + leechlife: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + poisonfang: ["9M"], + poisonjab: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + raindance: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scaleshot: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + seedbomb: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + sludgewave: ["9M"], + snarl: ["9M"], + snore: ["9M"], + spitup: ["9M"], + spite: ["9M"], + stockpile: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + swallow: ["9M"], + switcheroo: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + thunderfang: ["9M"], + toxic: ["9M"], + toxicspikes: ["9M"], + trailblaze: ["9M"], + venoshock: ["9M"], + wrap: ["9M"], + }, + }, + pikachu: { + learnset: { + agility: ["9M"], + alluringvoice: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + charge: ["9M"], + chargebeam: ["9M"], + charm: ["9M"], + dig: ["9M"], + discharge: ["9M"], + doubleteam: ["9M"], + drainingkiss: ["9M"], + eerieimpulse: ["9M"], + electricterrain: ["9M"], + electroball: ["9M"], + electroweb: ["9M"], + encore: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + faketears: ["9M"], + feint: ["9M"], + flail: ["9M"], + fling: ["9M"], + focuspunch: ["9M"], + grassknot: ["9M"], + helpinghand: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + lightscreen: ["9M"], + megakick: ["9M"], + nastyplot: ["9M"], + nuzzle: ["9M"], + playrough: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + reversal: ["9M"], + risingvoltage: ["9M"], + round: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + substitute: ["9M"], + surf: ["9M"], + sweetkiss: ["9M"], + thief: ["9M"], + thunder: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + tickle: ["9M"], + trailblaze: ["9M"], + upperhand: ["9M"], + voltswitch: ["9M"], + volttackle: ["9M"], + wildcharge: ["9M"], + wish: ["9M"], + zapcannon: ["9M"], + }, + }, + raichu: { + learnset: { + agility: ["9M"], + alluringvoice: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + charge: ["9M"], + chargebeam: ["9M"], + charm: ["9M"], + dazzlinggleam: ["9M"], + dig: ["9M"], + discharge: ["9M"], + doubleteam: ["9M"], + drainpunch: ["9M"], + drainingkiss: ["9M"], + eerieimpulse: ["9M"], + electricterrain: ["9M"], + electroball: ["9M"], + electroweb: ["9M"], + encore: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + faketears: ["9M"], + feint: ["9M"], + flail: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + lightscreen: ["9M"], + megakick: ["9M"], + nastyplot: ["9M"], + nuzzle: ["9M"], + playrough: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + reversal: ["9M"], + risingvoltage: ["9M"], + round: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + substitute: ["9M"], + surf: ["9M"], + sweetkiss: ["9M"], + thief: ["9M"], + thunder: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + tickle: ["9M"], + trailblaze: ["9M"], + upperhand: ["9M"], + voltswitch: ["9M"], + volttackle: ["9M"], + wildcharge: ["9M"], + wish: ["9M"], + zapcannon: ["9M"], + }, + }, + raichualola: { + learnset: { + agility: ["9M"], + alluringvoice: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + calmmind: ["9M"], + charge: ["9M"], + chargebeam: ["9M"], + charm: ["9M"], + dazzlinggleam: ["9M"], + dig: ["9M"], + discharge: ["9M"], + doubleteam: ["9M"], + drainingkiss: ["9M"], + eerieimpulse: ["9M"], + electricterrain: ["9M"], + electroball: ["9M"], + electroweb: ["9M"], + encore: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + expandingforce: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + faketears: ["9M"], + feint: ["9M"], + flail: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + lightscreen: ["9M"], + magicroom: ["9M"], + megakick: ["9M"], + nastyplot: ["9M"], + nuzzle: ["9M"], + playrough: ["9M"], + protect: ["9M"], + psychic: ["9M"], + psychicnoise: ["9M"], + psychicterrain: ["9M"], + psyshock: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + reversal: ["9M"], + risingvoltage: ["9M"], + round: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + speedswap: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + surf: ["9M"], + sweetkiss: ["9M"], + thief: ["9M"], + thunder: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + tickle: ["9M"], + trailblaze: ["9M"], + upperhand: ["9M"], + voltswitch: ["9M"], + volttackle: ["9M"], + wildcharge: ["9M"], + wish: ["9M"], + zapcannon: ["9M"], + }, + }, + clefable: { + learnset: { + afteryou: ["9M"], + airslash: ["9M"], + alluringvoice: ["9M"], + amnesia: ["9M"], + batonpass: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + bounce: ["9M"], + brickbreak: ["9M"], + calmmind: ["9M"], + chargebeam: ["9M"], + charm: ["9M"], + chillingwater: ["9M"], + copycat: ["9M"], + cosmicpower: ["9M"], + dazzlinggleam: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + drainpunch: ["9M"], + drainingkiss: ["9M"], + dualwingbeat: ["9M"], + encore: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + faketears: ["9M"], + fireblast: ["9M"], + firepunch: ["9M"], + flamethrower: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + followme: ["9M"], + futuresight: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gravity: ["9M"], + healpulse: ["9M"], + healingwish: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icebeam: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + imprison: ["9M"], + knockoff: ["9M"], + lifedew: ["9M"], + lightscreen: ["9M"], + meteorbeam: ["9M"], + meteormash: ["9M"], + mistyexplosion: ["9M"], + mistyterrain: ["9M"], + moonblast: ["9M"], + moonlight: ["9M"], + mysticalfire: ["9M"], + nightshade: ["9M"], + playrough: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + shadowball: ["9M"], + sing: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + stealthrock: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + sweetkiss: ["9M"], + thief: ["9M"], + thunder: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + tickle: ["9M"], + triattack: ["9M"], + trick: ["9M"], + uproar: ["9M"], + waterpulse: ["9M"], + wish: ["9M"], + wonderroom: ["9M"], + zenheadbutt: ["9M"], + }, + }, + ninetales: { + learnset: { + agility: ["9M"], + attract: ["9M"], + babydolleyes: ["9M"], + batonpass: ["9M"], + bodyslam: ["9M"], + burningjealousy: ["9M"], + calmmind: ["9M"], + charm: ["9M"], + confuseray: ["9M"], + darkpulse: ["9M"], + dig: ["9M"], + disable: ["9M"], + doubleedge: ["9M"], + encore: ["9M"], + endure: ["9M"], + energyball: ["9M"], + extrasensory: ["9M"], + facade: ["9M"], + faketears: ["9M"], + fireblast: ["9M"], + firespin: ["9M"], + flail: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + healingwish: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + hex: ["9M"], + howl: ["9M"], + hyperbeam: ["9M"], + hypnosis: ["9M"], + imprison: ["9M"], + inferno: ["9M"], + irontail: ["9M"], + memento: ["9M"], + mysticalfire: ["9M"], + nastyplot: ["9M"], + nightshade: ["9M"], + overheat: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + powerswap: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psyshock: ["9M"], + quickattack: ["9M"], + rest: ["9M"], + roar: ["9M"], + round: ["9M"], + safeguard: ["9M"], + scorchingsands: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + spite: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + tailslap: ["9M"], + weatherball: ["9M"], + willowisp: ["9M"], + zenheadbutt: ["9M"], + }, + }, + ninetalesalola: { + learnset: { + agility: ["9M"], + attract: ["9M"], + auroraveil: ["9M"], + avalanche: ["9M"], + babydolleyes: ["9M"], + batonpass: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + calmmind: ["9M"], + charm: ["9M"], + chillingwater: ["9M"], + confuseray: ["9M"], + darkpulse: ["9M"], + dazzlinggleam: ["9M"], + dig: ["9M"], + disable: ["9M"], + doubleedge: ["9M"], + drainingkiss: ["9M"], + encore: ["9M"], + endure: ["9M"], + extrasensory: ["9M"], + facade: ["9M"], + faketears: ["9M"], + flail: ["9M"], + foulplay: ["9M"], + freezedry: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + hex: ["9M"], + howl: ["9M"], + hyperbeam: ["9M"], + hypnosis: ["9M"], + icebeam: ["9M"], + iceshard: ["9M"], + iciclespear: ["9M"], + icywind: ["9M"], + imprison: ["9M"], + irontail: ["9M"], + mistyterrain: ["9M"], + moonblast: ["9M"], + nastyplot: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + playrough: ["9M"], + powerswap: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roar: ["9M"], + round: ["9M"], + safeguard: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + spite: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + tailslap: ["9M"], + tripleaxel: ["9M"], + weatherball: ["9M"], + wonderroom: ["9M"], + zenheadbutt: ["9M"], + }, + }, + arcanine: { + learnset: { + aerialace: ["9M"], + agility: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + burnup: ["9M"], + charm: ["9M"], + closecombat: ["9M"], + covet: ["9M"], + crunch: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + dragonpulse: ["9M"], + endure: ["9M"], + extremespeed: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firefang: ["9M"], + firespin: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + gigaimpact: ["9M"], + heatcrash: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + howl: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + morningsun: ["9M"], + outrage: ["9M"], + overheat: ["9M"], + playrough: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + ragingfury: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roar: ["9M"], + round: ["9M"], + scaryface: ["9M"], + scorchingsands: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + temperflare: ["9M"], + thief: ["9M"], + thrash: ["9M"], + thunderfang: ["9M"], + wildcharge: ["9M"], + willowisp: ["9M"], + }, + }, + arcaninehisui: { + learnset: { + aerialace: ["9M"], + agility: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + burnup: ["9M"], + closecombat: ["9M"], + covet: ["9M"], + crunch: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + dragonpulse: ["9M"], + endure: ["9M"], + extremespeed: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firefang: ["9M"], + firespin: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + gigaimpact: ["9M"], + headsmash: ["9M"], + heatcrash: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + howl: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + morningsun: ["9M"], + outrage: ["9M"], + overheat: ["9M"], + powergem: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + ragingfury: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roar: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + scorchingsands: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + smartstrike: ["9M"], + snarl: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + stealthrock: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + temperflare: ["9M"], + thief: ["9M"], + thrash: ["9M"], + thunderfang: ["9M"], + wildcharge: ["9M"], + willowisp: ["9M"], + }, + }, + alakazam: { + learnset: { + allyswitch: ["9M"], + attract: ["9M"], + bodyslam: ["9M"], + calmmind: ["9M"], + dazzlinggleam: ["9M"], + disable: ["9M"], + doubleteam: ["9M"], + drainpunch: ["9M"], + encore: ["9M"], + endure: ["9M"], + energyball: ["9M"], + expandingforce: ["9M"], + facade: ["9M"], + firepunch: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + foulplay: ["9M"], + futuresight: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + guardsplit: ["9M"], + guardswap: ["9M"], + hyperbeam: ["9M"], + icepunch: ["9M"], + imprison: ["9M"], + irontail: ["9M"], + lightscreen: ["9M"], + magicroom: ["9M"], + megakick: ["9M"], + nastyplot: ["9M"], + powerswap: ["9M"], + protect: ["9M"], + psychic: ["9M"], + psychicterrain: ["9M"], + psychocut: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + recover: ["9M"], + reflect: ["9M"], + rest: ["9M"], + roleplay: ["9M"], + round: ["9M"], + safeguard: ["9M"], + shadowball: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + speedswap: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + taunt: ["9M"], + thief: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + triattack: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + wonderroom: ["9M"], + zenheadbutt: ["9M"], + }, + }, + machamp: { + learnset: { + assurance: ["9M"], + attract: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + bulletpunch: ["9M"], + closecombat: ["9M"], + coaching: ["9M"], + counter: ["9M"], + crosschop: ["9M"], + crosspoison: ["9M"], + darkestlariat: ["9M"], + detect: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + drainpunch: ["9M"], + dynamicpunch: ["9M"], + earthquake: ["9M"], + encore: ["9M"], + endure: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firepunch: ["9M"], + flamethrower: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focusenergy: ["9M"], + gigaimpact: ["9M"], + heavyslam: ["9M"], + helpinghand: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + icepunch: ["9M"], + knockoff: ["9M"], + lightscreen: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + megakick: ["9M"], + payback: ["9M"], + poisonjab: ["9M"], + protect: ["9M"], + quickguard: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scaryface: ["9M"], + seismictoss: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + stormthrow: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + thunderpunch: ["9M"], + tickle: ["9M"], + wideguard: ["9M"], + }, + }, + victreebel: { + learnset: { + acidspray: ["9M"], + bodyslam: ["9M"], + bugbite: ["9M"], + bulletseed: ["9M"], + clearsmog: ["9M"], + encore: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + gastroacid: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + grassyterrain: ["9M"], + growth: ["9M"], + hyperbeam: ["9M"], + ingrain: ["9M"], + knockoff: ["9M"], + leafblade: ["9M"], + leafstorm: ["9M"], + leechlife: ["9M"], + lunge: ["9M"], + poisonjab: ["9M"], + poisonpowder: ["9M"], + pounce: ["9M"], + powerwhip: ["9M"], + protect: ["9M"], + reflect: ["9M"], + rest: ["9M"], + round: ["9M"], + scaryface: ["9M"], + seedbomb: ["9M"], + sleeppowder: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + sludgewave: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + spitup: ["9M"], + stockpile: ["9M"], + strengthsap: ["9M"], + stunspore: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + swallow: ["9M"], + sweetscent: ["9M"], + swordsdance: ["9M"], + synthesis: ["9M"], + thief: ["9M"], + tickle: ["9M"], + toxic: ["9M"], + toxicspikes: ["9M"], + trailblaze: ["9M"], + venoshock: ["9M"], + weatherball: ["9M"], + worryseed: ["9M"], + wrap: ["9M"], + }, + }, + slowbro: { + learnset: { + amnesia: ["9M"], + avalanche: ["9M"], + belch: ["9M"], + bellydrum: ["9M"], + blizzard: ["9M"], + block: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulldoze: ["9M"], + calmmind: ["9M"], + chillingwater: ["9M"], + curse: ["9M"], + dig: ["9M"], + disable: ["9M"], + dive: ["9M"], + drainpunch: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + expandingforce: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + flamethrower: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + foulplay: ["9M"], + futuresight: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + healpulse: ["9M"], + helpinghand: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + imprison: ["9M"], + irondefense: ["9M"], + irontail: ["9M"], + lightscreen: ["9M"], + liquidation: ["9M"], + mudshot: ["9M"], + muddywater: ["9M"], + nastyplot: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psychicnoise: ["9M"], + psychicterrain: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + razorshell: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + scald: ["9M"], + shadowball: ["9M"], + skillswap: ["9M"], + slackoff: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + surf: ["9M"], + thunderwave: ["9M"], + triattack: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + weatherball: ["9M"], + whirlpool: ["9M"], + wonderroom: ["9M"], + yawn: ["9M"], + zenheadbutt: ["9M"], + }, + }, + slowbrogalar: { + learnset: { + acidspray: ["9M"], + amnesia: ["9M"], + avalanche: ["9M"], + belch: ["9M"], + bellydrum: ["9M"], + blizzard: ["9M"], + block: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulldoze: ["9M"], + calmmind: ["9M"], + chillingwater: ["9M"], + curse: ["9M"], + dig: ["9M"], + disable: ["9M"], + dive: ["9M"], + doubleedge: ["9M"], + drainpunch: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + expandingforce: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + flamethrower: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + foulplay: ["9M"], + futuresight: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gunkshot: ["9M"], + haze: ["9M"], + healpulse: ["9M"], + helpinghand: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icefang: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + imprison: ["9M"], + irondefense: ["9M"], + irontail: ["9M"], + lightscreen: ["9M"], + liquidation: ["9M"], + mudshot: ["9M"], + muddywater: ["9M"], + nastyplot: ["9M"], + poisonjab: ["9M"], + powergem: ["9M"], + protect: ["9M"], + psychic: ["9M"], + psychicterrain: ["9M"], + psychup: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + razorshell: ["9M"], + rest: ["9M"], + rockblast: ["9M"], + round: ["9M"], + safeguard: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + shadowball: ["9M"], + shellsidearm: ["9M"], + skillswap: ["9M"], + slackoff: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + sludgewave: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + surf: ["9M"], + thunderwave: ["9M"], + toxic: ["9M"], + toxicspikes: ["9M"], + triattack: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + venoshock: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + weatherball: ["9M"], + whirlpool: ["9M"], + wonderroom: ["9M"], + yawn: ["9M"], + zenheadbutt: ["9M"], + }, + }, + gengar: { + learnset: { + acidspray: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + clearsmog: ["9M"], + confuseray: ["9M"], + corrosivegas: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + dazzlinggleam: ["9M"], + destinybond: ["9M"], + disable: ["9M"], + drainpunch: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + firepunch: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + foulplay: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + gunkshot: ["9M"], + haze: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + hypnosis: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + imprison: ["9M"], + knockoff: ["9M"], + meanlook: ["9M"], + nastyplot: ["9M"], + nightshade: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + perishsong: ["9M"], + phantomforce: ["9M"], + poisonjab: ["9M"], + poltergeist: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psychicnoise: ["9M"], + raindance: ["9M"], + reflecttype: ["9M"], + rest: ["9M"], + round: ["9M"], + scaryface: ["9M"], + selfdestruct: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + shadowpunch: ["9M"], + skillswap: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + sludgewave: ["9M"], + snore: ["9M"], + spite: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + taunt: ["9M"], + thief: ["9M"], + thunder: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + toxic: ["9M"], + toxicspikes: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + venoshock: ["9M"], + willowisp: ["9M"], + wonderroom: ["9M"], + }, + }, + kangaskhan: { + learnset: { + assurance: ["9M"], + attract: ["9M"], + avalanche: ["9M"], + beatup: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulldoze: ["9M"], + circlethrow: ["9M"], + counter: ["9M"], + crunch: ["9M"], + dig: ["9M"], + disable: ["9M"], + doublehit: ["9M"], + doubleedge: ["9M"], + drainpunch: ["9M"], + dynamicpunch: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + fireblast: ["9M"], + firepunch: ["9M"], + flamethrower: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focusenergy: ["9M"], + gigaimpact: ["9M"], + hammerarm: ["9M"], + helpinghand: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + irontail: ["9M"], + lastresort: ["9M"], + lowkick: ["9M"], + megakick: ["9M"], + outrage: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + safeguard: ["9M"], + sandstorm: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + surf: ["9M"], + terrainpulse: ["9M"], + thief: ["9M"], + thunder: ["9M"], + thunderpunch: ["9M"], + thunderbolt: ["9M"], + uproar: ["9M"], + whirlpool: ["9M"], + }, + }, + starmie: { + learnset: { + agility: ["9M"], + allyswitch: ["9M"], + ancientpower: ["9M"], + aquajet: ["9M"], + avalanche: ["9M"], + blizzard: ["9M"], + bulkup: ["9M"], + chargebeam: ["9M"], + chillingwater: ["9M"], + confuseray: ["9M"], + cosmicpower: ["9M"], + dazzlinggleam: ["9M"], + dive: ["9M"], + doubleedge: ["9M"], + endure: ["9M"], + expandingforce: ["9M"], + facade: ["9M"], + flashcannon: ["9M"], + flipturn: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gravity: ["9M"], + gyroball: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icespinner: ["9M"], + icywind: ["9M"], + lightscreen: ["9M"], + liquidation: ["9M"], + meteorbeam: ["9M"], + minimize: ["9M"], + powergem: ["9M"], + protect: ["9M"], + psychic: ["9M"], + psychocut: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + rapidspin: ["9M"], + recover: ["9M"], + reflect: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + scald: ["9M"], + selfdestruct: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + substitute: ["9M"], + surf: ["9M"], + thunder: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + triattack: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + whirlpool: ["9M"], + wonderroom: ["9M"], + zenheadbutt: ["9M"], + }, + }, + pinsir: { + learnset: { + aerialace: ["9M"], + attract: ["9M"], + bind: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bugbite: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + circlethrow: ["9M"], + closecombat: ["9M"], + detect: ["9M"], + dig: ["9M"], + doublehit: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + feint: ["9M"], + flail: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focusenergy: ["9M"], + gigaimpact: ["9M"], + guillotine: ["9M"], + hardpress: ["9M"], + helpinghand: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + irondefense: ["9M"], + lunge: ["9M"], + pounce: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + seismictoss: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + stoneedge: ["9M"], + stormthrow: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + swordsdance: ["9M"], + thief: ["9M"], + thrash: ["9M"], + throatchop: ["9M"], + xscissor: ["9M"], + }, + }, + tauros: { + learnset: { + assurance: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + closecombat: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + flamethrower: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icywind: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + lashout: ["9M"], + megahorn: ["9M"], + outrage: ["9M"], + payback: ["9M"], + protect: ["9M"], + ragingbull: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + smartstrike: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + surf: ["9M"], + swagger: ["9M"], + thief: ["9M"], + thrash: ["9M"], + throatchop: ["9M"], + thunder: ["9M"], + thunderbolt: ["9M"], + trailblaze: ["9M"], + uproar: ["9M"], + whirlpool: ["9M"], + wildcharge: ["9M"], + zenheadbutt: ["9M"], + }, + }, + taurospaldeacombat: { + learnset: { + assurance: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + closecombat: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + drillrun: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + gigaimpact: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + lashout: ["9M"], + megahorn: ["9M"], + outrage: ["9M"], + protect: ["9M"], + ragingbull: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + sleeptalk: ["9M"], + smartstrike: ["9M"], + snore: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + surf: ["9M"], + swagger: ["9M"], + thief: ["9M"], + thrash: ["9M"], + throatchop: ["9M"], + trailblaze: ["9M"], + uproar: ["9M"], + wildcharge: ["9M"], + zenheadbutt: ["9M"], + }, + }, + taurospaldeablaze: { + learnset: { + bodypress: ["9M"], + bodyslam: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + closecombat: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + drillrun: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firespin: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + gigaimpact: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + lashout: ["9M"], + megahorn: ["9M"], + outrage: ["9M"], + overheat: ["9M"], + protect: ["9M"], + ragingbull: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + sleeptalk: ["9M"], + smartstrike: ["9M"], + snore: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swagger: ["9M"], + temperflare: ["9M"], + thief: ["9M"], + thrash: ["9M"], + trailblaze: ["9M"], + uproar: ["9M"], + wildcharge: ["9M"], + willowisp: ["9M"], + zenheadbutt: ["9M"], + }, + }, + taurospaldeaaqua: { + learnset: { + aquajet: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + chillingwater: ["9M"], + closecombat: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + drillrun: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + gigaimpact: ["9M"], + highhorsepower: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + lashout: ["9M"], + liquidation: ["9M"], + megahorn: ["9M"], + outrage: ["9M"], + protect: ["9M"], + ragingbull: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + sleeptalk: ["9M"], + smartstrike: ["9M"], + snore: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + surf: ["9M"], + swagger: ["9M"], + thief: ["9M"], + thrash: ["9M"], + trailblaze: ["9M"], + uproar: ["9M"], + waterpulse: ["9M"], + wavecrash: ["9M"], + whirlpool: ["9M"], + wildcharge: ["9M"], + zenheadbutt: ["9M"], + }, + }, + gyarados: { + learnset: { + aquatail: ["9M"], + avalanche: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + bounce: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + chillingwater: ["9M"], + crunch: ["9M"], + darkpulse: ["9M"], + dive: ["9M"], + doubleedge: ["9M"], + dragoncheer: ["9M"], + dragondance: ["9M"], + dragonpulse: ["9M"], + dragonrush: ["9M"], + dragontail: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + flail: ["9M"], + flamethrower: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + hurricane: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icefang: ["9M"], + icywind: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + lashout: ["9M"], + muddywater: ["9M"], + outrage: ["9M"], + payback: ["9M"], + powerwhip: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roar: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scald: ["9M"], + scaleshot: ["9M"], + scaryface: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + spite: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + surf: ["9M"], + swagger: ["9M"], + taunt: ["9M"], + temperflare: ["9M"], + thrash: ["9M"], + thunder: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + uproar: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + whirlpool: ["9M"], + }, + }, + ditto: { + learnset: { + transform: ["9M"], + }, + }, + vaporeon: { + learnset: { + acidarmor: ["9M"], + alluringvoice: ["9M"], + aquaring: ["9M"], + babydolleyes: ["9M"], + batonpass: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + calmmind: ["9M"], + charm: ["9M"], + chillingwater: ["9M"], + copycat: ["9M"], + covet: ["9M"], + curse: ["9M"], + detect: ["9M"], + dig: ["9M"], + dive: ["9M"], + doubleedge: ["9M"], + endure: ["9M"], + facade: ["9M"], + faketears: ["9M"], + flail: ["9M"], + flipturn: ["9M"], + focusenergy: ["9M"], + gigaimpact: ["9M"], + haze: ["9M"], + helpinghand: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icebeam: ["9M"], + icywind: ["9M"], + irontail: ["9M"], + lastresort: ["9M"], + liquidation: ["9M"], + mudslap: ["9M"], + muddywater: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roar: ["9M"], + round: ["9M"], + scald: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + surf: ["9M"], + tickle: ["9M"], + trailblaze: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + weatherball: ["9M"], + whirlpool: ["9M"], + wish: ["9M"], + yawn: ["9M"], + }, + }, + jolteon: { + learnset: { + agility: ["9M"], + alluringvoice: ["9M"], + babydolleyes: ["9M"], + batonpass: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + calmmind: ["9M"], + charge: ["9M"], + chargebeam: ["9M"], + charm: ["9M"], + copycat: ["9M"], + covet: ["9M"], + curse: ["9M"], + detect: ["9M"], + dig: ["9M"], + discharge: ["9M"], + doubleedge: ["9M"], + eerieimpulse: ["9M"], + electricterrain: ["9M"], + electroball: ["9M"], + electroweb: ["9M"], + endure: ["9M"], + facade: ["9M"], + faketears: ["9M"], + flail: ["9M"], + focusenergy: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + lastresort: ["9M"], + lightscreen: ["9M"], + metalsound: ["9M"], + mudslap: ["9M"], + pinmissile: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + rest: ["9M"], + risingvoltage: ["9M"], + roar: ["9M"], + round: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + thunder: ["9M"], + thunderfang: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + tickle: ["9M"], + trailblaze: ["9M"], + voltswitch: ["9M"], + weatherball: ["9M"], + wildcharge: ["9M"], + wish: ["9M"], + yawn: ["9M"], + }, + }, + flareon: { + learnset: { + alluringvoice: ["9M"], + babydolleyes: ["9M"], + batonpass: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + burningjealousy: ["9M"], + calmmind: ["9M"], + charm: ["9M"], + copycat: ["9M"], + covet: ["9M"], + curse: ["9M"], + detect: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + faketears: ["9M"], + fireblast: ["9M"], + firefang: ["9M"], + firespin: ["9M"], + flail: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + focusenergy: ["9M"], + gigaimpact: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + lastresort: ["9M"], + lavaplume: ["9M"], + mudslap: ["9M"], + overheat: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roar: ["9M"], + round: ["9M"], + scaryface: ["9M"], + scorchingsands: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + temperflare: ["9M"], + tickle: ["9M"], + trailblaze: ["9M"], + weatherball: ["9M"], + willowisp: ["9M"], + wish: ["9M"], + yawn: ["9M"], + }, + }, + aerodactyl: { + learnset: { + aerialace: ["9M"], + agility: ["9M"], + ancientpower: ["9M"], + assurance: ["9M"], + attract: ["9M"], + bite: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + crunch: ["9M"], + curse: ["9M"], + dragonclaw: ["9M"], + dragondance: ["9M"], + dragonpulse: ["9M"], + dualwingbeat: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firefang: ["9M"], + flamethrower: ["9M"], + fly: ["9M"], + gigaimpact: ["9M"], + heatwave: ["9M"], + hurricane: ["9M"], + hyperbeam: ["9M"], + icefang: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + meteorbeam: ["9M"], + payback: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roar: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + roost: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + skyattack: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + stealthrock: ["9M"], + steelwing: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swagger: ["9M"], + tailwind: ["9M"], + taunt: ["9M"], + thief: ["9M"], + thunderfang: ["9M"], + whirlwind: ["9M"], + wideguard: ["9M"], + }, + }, + snorlax: { + learnset: { + amnesia: ["9M"], + attract: ["9M"], + belch: ["9M"], + bellydrum: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + block: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulldoze: ["9M"], + charm: ["9M"], + chillingwater: ["9M"], + counter: ["9M"], + covet: ["9M"], + crunch: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + earthquake: ["9M"], + encore: ["9M"], + endure: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firepunch: ["9M"], + fissure: ["9M"], + flail: ["9M"], + flamethrower: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gastroacid: ["9M"], + gigaimpact: ["9M"], + gunkshot: ["9M"], + hammerarm: ["9M"], + hardpress: ["9M"], + heatcrash: ["9M"], + heavyslam: ["9M"], + helpinghand: ["9M"], + highhorsepower: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icebeam: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + ironhead: ["9M"], + lastresort: ["9M"], + mudslap: ["9M"], + outrage: ["9M"], + protect: ["9M"], + raindance: ["9M"], + recycle: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + screech: ["9M"], + seedbomb: ["9M"], + selfdestruct: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + stockpile: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + supercellslam: ["9M"], + superpower: ["9M"], + surf: ["9M"], + swallow: ["9M"], + terrainpulse: ["9M"], + thunder: ["9M"], + thunderpunch: ["9M"], + thunderbolt: ["9M"], + trailblaze: ["9M"], + uproar: ["9M"], + wildcharge: ["9M"], + yawn: ["9M"], + zenheadbutt: ["9M"], + }, + }, + dragonite: { + learnset: { + aerialace: ["9M"], + agility: ["9M"], + aircutter: ["9M"], + airslash: ["9M"], + aquajet: ["9M"], + aquatail: ["9M"], + blizzard: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + chillingwater: ["9M"], + dive: ["9M"], + dracometeor: ["9M"], + dragoncheer: ["9M"], + dragonclaw: ["9M"], + dragondance: ["9M"], + dragonpulse: ["9M"], + dragonrush: ["9M"], + dragontail: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + extremespeed: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firepunch: ["9M"], + firespin: ["9M"], + flamethrower: ["9M"], + fling: ["9M"], + fly: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + haze: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + hurricane: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icepunch: ["9M"], + icespinner: ["9M"], + icywind: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + lightscreen: ["9M"], + lowkick: ["9M"], + megakick: ["9M"], + outrage: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + roost: ["9M"], + round: ["9M"], + safeguard: ["9M"], + sandstorm: ["9M"], + scaleshot: ["9M"], + scaryface: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + steelwing: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + surf: ["9M"], + tailwind: ["9M"], + thunder: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + weatherball: ["9M"], + whirlwind: ["9M"], + wrap: ["9M"], + }, + }, + meganium: { + learnset: { + ancientpower: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + bulletseed: ["9M"], + charm: ["9M"], + counter: ["9M"], + curse: ["9M"], + dazzlinggleam: ["9M"], + doubleedge: ["9M"], + dragontail: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + encore: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + faketears: ["9M"], + flail: ["9M"], + frenzyplant: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + grassyterrain: ["9M"], + healpulse: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + ingrain: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + leafblade: ["9M"], + leafstorm: ["9M"], + leechseed: ["9M"], + lightscreen: ["9M"], + mudslap: ["9M"], + outrage: ["9M"], + petalblizzard: ["9M"], + petaldance: ["9M"], + poisonpowder: ["9M"], + pollenpuff: ["9M"], + protect: ["9M"], + reflect: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + seedbomb: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + solarblade: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + sweetscent: ["9M"], + swordsdance: ["9M"], + synthesis: ["9M"], + trailblaze: ["9M"], + weatherball: ["9M"], + zenheadbutt: ["9M"], + }, + }, + typhlosion: { + learnset: { + aerialace: ["9M"], + blastburn: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulldoze: ["9M"], + burnup: ["9M"], + burningjealousy: ["9M"], + covet: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + eruption: ["9M"], + extrasensory: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firefang: ["9M"], + firepunch: ["9M"], + firespin: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + gyroball: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + howl: ["9M"], + hyperbeam: ["9M"], + inferno: ["9M"], + ironhead: ["9M"], + lavaplume: ["9M"], + lowkick: ["9M"], + megakick: ["9M"], + overheat: ["9M"], + playrough: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scorchingsands: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + temperflare: ["9M"], + throatchop: ["9M"], + thunderpunch: ["9M"], + wildcharge: ["9M"], + willowisp: ["9M"], + zenheadbutt: ["9M"], + }, + }, + typhlosionhisui: { + learnset: { + aerialace: ["9M"], + blastburn: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulldoze: ["9M"], + burnup: ["9M"], + burningjealousy: ["9M"], + calmmind: ["9M"], + confuseray: ["9M"], + covet: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + eruption: ["9M"], + extrasensory: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firefang: ["9M"], + firepunch: ["9M"], + firespin: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + gyroball: ["9M"], + heatwave: ["9M"], + hex: ["9M"], + howl: ["9M"], + hyperbeam: ["9M"], + infernalparade: ["9M"], + inferno: ["9M"], + ironhead: ["9M"], + lavaplume: ["9M"], + lowkick: ["9M"], + megakick: ["9M"], + mysticalfire: ["9M"], + nightshade: ["9M"], + overheat: ["9M"], + playrough: ["9M"], + poltergeist: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + round: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + spite: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + temperflare: ["9M"], + thunderpunch: ["9M"], + wildcharge: ["9M"], + willowisp: ["9M"], + zenheadbutt: ["9M"], + }, + }, + feraligatr: { + learnset: { + aerialace: ["9M"], + agility: ["9M"], + ancientpower: ["9M"], + aquajet: ["9M"], + aquatail: ["9M"], + avalanche: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + block: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + chillingwater: ["9M"], + counter: ["9M"], + crunch: ["9M"], + curse: ["9M"], + dig: ["9M"], + dive: ["9M"], + doubleedge: ["9M"], + dragonclaw: ["9M"], + dragondance: ["9M"], + dragonpulse: ["9M"], + dragontail: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + faketears: ["9M"], + flail: ["9M"], + flatter: ["9M"], + fling: ["9M"], + flipturn: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + hydrocannon: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icefang: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + irontail: ["9M"], + lashout: ["9M"], + liquidation: ["9M"], + lowkick: ["9M"], + megakick: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + muddywater: ["9M"], + outrage: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scaleshot: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + spite: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + superpower: ["9M"], + surf: ["9M"], + swordsdance: ["9M"], + thief: ["9M"], + thrash: ["9M"], + trailblaze: ["9M"], + uproar: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + whirlpool: ["9M"], + }, + }, + ariados: { + learnset: { + acidspray: ["9M"], + agility: ["9M"], + assurance: ["9M"], + batonpass: ["9M"], + bodyslam: ["9M"], + bounce: ["9M"], + bugbite: ["9M"], + bugbuzz: ["9M"], + crosspoison: ["9M"], + dig: ["9M"], + disable: ["9M"], + electroweb: ["9M"], + endure: ["9M"], + facade: ["9M"], + fellstinger: ["9M"], + firstimpression: ["9M"], + focusenergy: ["9M"], + foulplay: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + infestation: ["9M"], + knockoff: ["9M"], + leechlife: ["9M"], + lunge: ["9M"], + megahorn: ["9M"], + nightshade: ["9M"], + nightslash: ["9M"], + pinmissile: ["9M"], + poisonjab: ["9M"], + pounce: ["9M"], + protect: ["9M"], + psychic: ["9M"], + ragepowder: ["9M"], + rest: ["9M"], + round: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + shadowsneak: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + sludgewave: ["9M"], + smartstrike: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + spite: ["9M"], + stickyweb: ["9M"], + stompingtantrum: ["9M"], + stringshot: ["9M"], + strugglebug: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + toxic: ["9M"], + toxicspikes: ["9M"], + toxicthread: ["9M"], + trailblaze: ["9M"], + venoshock: ["9M"], + xscissor: ["9M"], + }, + }, + ampharos: { + learnset: { + afteryou: ["9M"], + agility: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + charge: ["9M"], + chargebeam: ["9M"], + confuseray: ["9M"], + cottonguard: ["9M"], + cottonspore: ["9M"], + dazzlinggleam: ["9M"], + dig: ["9M"], + discharge: ["9M"], + doubleedge: ["9M"], + dragoncheer: ["9M"], + dragonpulse: ["9M"], + dragontail: ["9M"], + eerieimpulse: ["9M"], + electricterrain: ["9M"], + electroball: ["9M"], + electroweb: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + firepunch: ["9M"], + flatter: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + icepunch: ["9M"], + irontail: ["9M"], + lightscreen: ["9M"], + lowkick: ["9M"], + magneticflux: ["9M"], + megakick: ["9M"], + meteorbeam: ["9M"], + outrage: ["9M"], + paraboliccharge: ["9M"], + powergem: ["9M"], + protect: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + risingvoltage: ["9M"], + roar: ["9M"], + round: ["9M"], + safeguard: ["9M"], + screech: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + supercellslam: ["9M"], + thunder: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + trailblaze: ["9M"], + voltswitch: ["9M"], + wildcharge: ["9M"], + zapcannon: ["9M"], + }, + }, + azumarill: { + learnset: { + alluringvoice: ["9M"], + amnesia: ["9M"], + aquajet: ["9M"], + aquaring: ["9M"], + aquatail: ["9M"], + bellydrum: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + bounce: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + charm: ["9M"], + chillingwater: ["9M"], + copycat: ["9M"], + dig: ["9M"], + dive: ["9M"], + doubleedge: ["9M"], + drainingkiss: ["9M"], + encore: ["9M"], + endure: ["9M"], + facade: ["9M"], + faketears: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + futuresight: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + helpinghand: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icebeam: ["9M"], + icepunch: ["9M"], + icespinner: ["9M"], + icywind: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + lightscreen: ["9M"], + liquidation: ["9M"], + mistyexplosion: ["9M"], + mistyterrain: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + muddywater: ["9M"], + perishsong: ["9M"], + playrough: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + round: ["9M"], + sing: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + soak: ["9M"], + substitute: ["9M"], + superpower: ["9M"], + surf: ["9M"], + tickle: ["9M"], + trailblaze: ["9M"], + uproar: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + whirlpool: ["9M"], + }, + }, + politoed: { + learnset: { + amnesia: ["9M"], + attract: ["9M"], + bellydrum: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + bounce: ["9M"], + brickbreak: ["9M"], + bulldoze: ["9M"], + chillingwater: ["9M"], + dig: ["9M"], + dive: ["9M"], + doubleedge: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + encore: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + haze: ["9M"], + helpinghand: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + hypnosis: ["9M"], + icebeam: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + liquidation: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + muddywater: ["9M"], + perishsong: ["9M"], + pound: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + raindance: ["9M"], + rest: ["9M"], + round: ["9M"], + screech: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + substitute: ["9M"], + surf: ["9M"], + swagger: ["9M"], + thief: ["9M"], + uproar: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + weatherball: ["9M"], + whirlpool: ["9M"], + }, + }, + espeon: { + learnset: { + alluringvoice: ["9M"], + babydolleyes: ["9M"], + batonpass: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + calmmind: ["9M"], + charm: ["9M"], + confuseray: ["9M"], + copycat: ["9M"], + covet: ["9M"], + curse: ["9M"], + dazzlinggleam: ["9M"], + detect: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + drainingkiss: ["9M"], + endure: ["9M"], + expandingforce: ["9M"], + facade: ["9M"], + faketears: ["9M"], + flail: ["9M"], + focusenergy: ["9M"], + futuresight: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gravity: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + imprison: ["9M"], + lastresort: ["9M"], + lightscreen: ["9M"], + magicroom: ["9M"], + morningsun: ["9M"], + mudslap: ["9M"], + powergem: ["9M"], + powerswap: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psychicfangs: ["9M"], + psychicnoise: ["9M"], + psychicterrain: ["9M"], + psyshock: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + roar: ["9M"], + round: ["9M"], + safeguard: ["9M"], + shadowball: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + thunderwave: ["9M"], + tickle: ["9M"], + trailblaze: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + weatherball: ["9M"], + wish: ["9M"], + yawn: ["9M"], + zenheadbutt: ["9M"], + }, + }, + umbreon: { + learnset: { + alluringvoice: ["9M"], + assurance: ["9M"], + babydolleyes: ["9M"], + batonpass: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + calmmind: ["9M"], + charm: ["9M"], + confuseray: ["9M"], + copycat: ["9M"], + covet: ["9M"], + crunch: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + detect: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + endure: ["9M"], + facade: ["9M"], + faketears: ["9M"], + flail: ["9M"], + focusenergy: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + guardswap: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + lashout: ["9M"], + lastresort: ["9M"], + lightscreen: ["9M"], + meanlook: ["9M"], + moonlight: ["9M"], + mudslap: ["9M"], + payback: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + roar: ["9M"], + round: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + shadowball: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + spite: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swagger: ["9M"], + taunt: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + thunderwave: ["9M"], + tickle: ["9M"], + torment: ["9M"], + toxic: ["9M"], + trailblaze: ["9M"], + weatherball: ["9M"], + wish: ["9M"], + yawn: ["9M"], + }, + }, + slowking: { + learnset: { + amnesia: ["9M"], + avalanche: ["9M"], + belch: ["9M"], + bellydrum: ["9M"], + blizzard: ["9M"], + block: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulldoze: ["9M"], + calmmind: ["9M"], + chillingwater: ["9M"], + chillyreception: ["9M"], + curse: ["9M"], + dig: ["9M"], + disable: ["9M"], + dive: ["9M"], + drainpunch: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + expandingforce: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firepunch: ["9M"], + flamethrower: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + foulplay: ["9M"], + futuresight: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + healpulse: ["9M"], + helpinghand: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + imprison: ["9M"], + irondefense: ["9M"], + irontail: ["9M"], + lightscreen: ["9M"], + liquidation: ["9M"], + mudshot: ["9M"], + muddywater: ["9M"], + nastyplot: ["9M"], + powergem: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psychicnoise: ["9M"], + psychicterrain: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + razorshell: ["9M"], + reflect: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + safeguard: ["9M"], + scald: ["9M"], + shadowball: ["9M"], + skillswap: ["9M"], + slackoff: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + surf: ["9M"], + swagger: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + triattack: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + weatherball: ["9M"], + whirlpool: ["9M"], + wonderroom: ["9M"], + yawn: ["9M"], + zenheadbutt: ["9M"], + }, + }, + slowkinggalar: { + learnset: { + acidspray: ["9M"], + amnesia: ["9M"], + avalanche: ["9M"], + belch: ["9M"], + bellydrum: ["9M"], + blizzard: ["9M"], + block: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulldoze: ["9M"], + calmmind: ["9M"], + chillingwater: ["9M"], + chillyreception: ["9M"], + curse: ["9M"], + dig: ["9M"], + disable: ["9M"], + dive: ["9M"], + drainpunch: ["9M"], + earthquake: ["9M"], + eeriespell: ["9M"], + endure: ["9M"], + expandingforce: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firepunch: ["9M"], + flamethrower: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + foulplay: ["9M"], + futuresight: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gunkshot: ["9M"], + healpulse: ["9M"], + helpinghand: ["9M"], + hex: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + imprison: ["9M"], + irondefense: ["9M"], + irontail: ["9M"], + lightscreen: ["9M"], + liquidation: ["9M"], + lowsweep: ["9M"], + mudshot: ["9M"], + muddywater: ["9M"], + nastyplot: ["9M"], + poisonjab: ["9M"], + powergem: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psychicnoise: ["9M"], + psychicterrain: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + razorshell: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + scaryface: ["9M"], + shadowball: ["9M"], + skillswap: ["9M"], + slackoff: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + sludgewave: ["9M"], + snarl: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + stompingtantrum: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + surf: ["9M"], + swagger: ["9M"], + taunt: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + toxic: ["9M"], + toxicspikes: ["9M"], + triattack: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + venoshock: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + weatherball: ["9M"], + whirlpool: ["9M"], + wonderroom: ["9M"], + yawn: ["9M"], + zenheadbutt: ["9M"], + }, + }, + forretress: { + learnset: { + bodypress: ["9M"], + bodyslam: ["9M"], + bugbite: ["9M"], + bugbuzz: ["9M"], + bulldoze: ["9M"], + counter: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + drillrun: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + explosion: ["9M"], + facade: ["9M"], + flail: ["9M"], + flashcannon: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + gravity: ["9M"], + gyroball: ["9M"], + hardpress: ["9M"], + heavyslam: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + icespinner: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + lightscreen: ["9M"], + lunge: ["9M"], + magnetrise: ["9M"], + metalsound: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + pinmissile: ["9M"], + poisonjab: ["9M"], + pounce: ["9M"], + powertrick: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rapidspin: ["9M"], + reflect: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandtomb: ["9M"], + sandstorm: ["9M"], + seedbomb: ["9M"], + selfdestruct: ["9M"], + sleeptalk: ["9M"], + smartstrike: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + spikes: ["9M"], + stealthrock: ["9M"], + steelbeam: ["9M"], + steelroller: ["9M"], + stoneedge: ["9M"], + strugglebug: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + thunderwave: ["9M"], + toxicspikes: ["9M"], + venoshock: ["9M"], + voltswitch: ["9M"], + zapcannon: ["9M"], + }, + }, + steelix: { + learnset: { + ancientpower: ["9M"], + attract: ["9M"], + bind: ["9M"], + block: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + crunch: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + dragondance: ["9M"], + dragonpulse: ["9M"], + dragontail: ["9M"], + drillrun: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + firefang: ["9M"], + fissure: ["9M"], + flail: ["9M"], + flashcannon: ["9M"], + gigaimpact: ["9M"], + gyroball: ["9M"], + headsmash: ["9M"], + heavyslam: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + icefang: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + magnetrise: ["9M"], + meteorbeam: ["9M"], + payback: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + rest: ["9M"], + rockblast: ["9M"], + rockpolish: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandtomb: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + scorchingsands: ["9M"], + screech: ["9M"], + selfdestruct: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + stealthrock: ["9M"], + steelbeam: ["9M"], + steelroller: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + taunt: ["9M"], + thunderfang: ["9M"], + wideguard: ["9M"], + }, + }, + scizor: { + learnset: { + acrobatics: ["9M"], + aerialace: ["9M"], + agility: ["9M"], + aircutter: ["9M"], + airslash: ["9M"], + assurance: ["9M"], + batonpass: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bugbite: ["9M"], + bugbuzz: ["9M"], + bulletpunch: ["9M"], + closecombat: ["9M"], + counter: ["9M"], + curse: ["9M"], + defog: ["9M"], + doublehit: ["9M"], + doubleteam: ["9M"], + doubleedge: ["9M"], + dualwingbeat: ["9M"], + endure: ["9M"], + facade: ["9M"], + feint: ["9M"], + flashcannon: ["9M"], + fling: ["9M"], + focusenergy: ["9M"], + gigaimpact: ["9M"], + hardpress: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + knockoff: ["9M"], + lightscreen: ["9M"], + lunge: ["9M"], + nightslash: ["9M"], + pounce: ["9M"], + protect: ["9M"], + psychocut: ["9M"], + quickattack: ["9M"], + quickguard: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roost: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + steelbeam: ["9M"], + steelwing: ["9M"], + strugglebug: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + swordsdance: ["9M"], + tailwind: ["9M"], + thief: ["9M"], + trailblaze: ["9M"], + uturn: ["9M"], + vacuumwave: ["9M"], + xscissor: ["9M"], + }, + }, + heracross: { + learnset: { + aerialace: ["9M"], + assurance: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bugbite: ["9M"], + bugbuzz: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + bulletseed: ["9M"], + circlethrow: ["9M"], + closecombat: ["9M"], + coaching: ["9M"], + counter: ["9M"], + curse: ["9M"], + detect: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + feint: ["9M"], + flail: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + irondefense: ["9M"], + knockoff: ["9M"], + lowkick: ["9M"], + lunge: ["9M"], + megahorn: ["9M"], + nightslash: ["9M"], + pinmissile: ["9M"], + pounce: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + seismictoss: ["9M"], + shadowclaw: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + smartstrike: ["9M"], + snore: ["9M"], + spikes: ["9M"], + stoneedge: ["9M"], + strugglebug: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + thief: ["9M"], + thrash: ["9M"], + throatchop: ["9M"], + trailblaze: ["9M"], + upperhand: ["9M"], + vacuumwave: ["9M"], + }, + }, + skarmory: { + learnset: { + aerialace: ["9M"], + agility: ["9M"], + aircutter: ["9M"], + airslash: ["9M"], + assurance: ["9M"], + bodypress: ["9M"], + bravebird: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + drillpeck: ["9M"], + drillrun: ["9M"], + dualwingbeat: ["9M"], + endure: ["9M"], + facade: ["9M"], + feint: ["9M"], + flashcannon: ["9M"], + fly: ["9M"], + gigaimpact: ["9M"], + hurricane: ["9M"], + hyperbeam: ["9M"], + icywind: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + metalsound: ["9M"], + nightslash: ["9M"], + payback: ["9M"], + protect: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + roost: ["9M"], + round: ["9M"], + sandtomb: ["9M"], + sandstorm: ["9M"], + skyattack: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + spikes: ["9M"], + stealthrock: ["9M"], + steelbeam: ["9M"], + steelwing: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + tailwind: ["9M"], + taunt: ["9M"], + thief: ["9M"], + whirlwind: ["9M"], + xscissor: ["9M"], + }, + }, + houndoom: { + learnset: { + beatup: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + burningjealousy: ["9M"], + comeuppance: ["9M"], + counter: ["9M"], + crunch: ["9M"], + darkpulse: ["9M"], + destinybond: ["9M"], + doubleedge: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + feint: ["9M"], + fireblast: ["9M"], + firefang: ["9M"], + firespin: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + howl: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + inferno: ["9M"], + irontail: ["9M"], + lashout: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + nastyplot: ["9M"], + overheat: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roar: ["9M"], + round: ["9M"], + scaryface: ["9M"], + scorchingsands: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + snarl: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + spite: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + superfang: ["9M"], + swagger: ["9M"], + taunt: ["9M"], + temperflare: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + thunderfang: ["9M"], + torment: ["9M"], + toxic: ["9M"], + trailblaze: ["9M"], + uproar: ["9M"], + willowisp: ["9M"], + }, + }, + tyranitar: { + learnset: { + aerialace: ["9M"], + ancientpower: ["9M"], + assurance: ["9M"], + avalanche: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + crunch: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + dragonclaw: ["9M"], + dragondance: ["9M"], + dragonpulse: ["9M"], + dragontail: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firefang: ["9M"], + firepunch: ["9M"], + flamethrower: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focusenergy: ["9M"], + focuspunch: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + hardpress: ["9M"], + heavyslam: ["9M"], + helpinghand: ["9M"], + highhorsepower: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icefang: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + lashout: ["9M"], + lowkick: ["9M"], + megakick: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + muddywater: ["9M"], + outrage: ["9M"], + payback: ["9M"], + powergem: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roar: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandtomb: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + snarl: ["9M"], + snore: ["9M"], + spite: ["9M"], + stealthrock: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + surf: ["9M"], + swagger: ["9M"], + taunt: ["9M"], + thrash: ["9M"], + thunder: ["9M"], + thunderfang: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + uproar: ["9M"], + }, + }, + pelipper: { + learnset: { + acrobatics: ["9M"], + aerialace: ["9M"], + agility: ["9M"], + aircutter: ["9M"], + airslash: ["9M"], + aquaring: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + bravebird: ["9M"], + chillingwater: ["9M"], + dualwingbeat: ["9M"], + endure: ["9M"], + facade: ["9M"], + featherdance: ["9M"], + fling: ["9M"], + fly: ["9M"], + gigaimpact: ["9M"], + gunkshot: ["9M"], + helpinghand: ["9M"], + hurricane: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icywind: ["9M"], + knockoff: ["9M"], + liquidation: ["9M"], + muddywater: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roost: ["9M"], + round: ["9M"], + seedbomb: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + soak: ["9M"], + spitup: ["9M"], + steelwing: ["9M"], + stockpile: ["9M"], + substitute: ["9M"], + surf: ["9M"], + swallow: ["9M"], + tailwind: ["9M"], + thief: ["9M"], + uturn: ["9M"], + uproar: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + weatherball: ["9M"], + whirlpool: ["9M"], + wideguard: ["9M"], + }, + }, + gardevoir: { + learnset: { + alluringvoice: ["9M"], + aurasphere: ["9M"], + bodyslam: ["9M"], + calmmind: ["9M"], + chargebeam: ["9M"], + charm: ["9M"], + confuseray: ["9M"], + dazzlinggleam: ["9M"], + destinybond: ["9M"], + disable: ["9M"], + doubleteam: ["9M"], + drainingkiss: ["9M"], + encore: ["9M"], + endure: ["9M"], + energyball: ["9M"], + expandingforce: ["9M"], + facade: ["9M"], + firepunch: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + futuresight: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gravity: ["9M"], + guardswap: ["9M"], + healpulse: ["9M"], + healingwish: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + hypnosis: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + imprison: ["9M"], + knockoff: ["9M"], + lifedew: ["9M"], + lightscreen: ["9M"], + magicroom: ["9M"], + meanlook: ["9M"], + memento: ["9M"], + mistyexplosion: ["9M"], + mistyterrain: ["9M"], + moonblast: ["9M"], + mysticalfire: ["9M"], + nightshade: ["9M"], + painsplit: ["9M"], + powerswap: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psychicnoise: ["9M"], + psychicterrain: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + shadowball: ["9M"], + shadowsneak: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swagger: ["9M"], + taunt: ["9M"], + thief: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + tripleaxel: ["9M"], + vacuumwave: ["9M"], + willowisp: ["9M"], + wish: ["9M"], + wonderroom: ["9M"], + zenheadbutt: ["9M"], + }, + }, + sableye: { + learnset: { + aerialace: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulkup: ["9M"], + calmmind: ["9M"], + confuseray: ["9M"], + darkpulse: ["9M"], + dazzlinggleam: ["9M"], + detect: ["9M"], + dig: ["9M"], + disable: ["9M"], + drainpunch: ["9M"], + encore: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + feint: ["9M"], + firepunch: ["9M"], + flatter: ["9M"], + fling: ["9M"], + focuspunch: ["9M"], + foulplay: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + gravity: ["9M"], + gyroball: ["9M"], + helpinghand: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + imprison: ["9M"], + knockoff: ["9M"], + lashout: ["9M"], + lightscreen: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + meanlook: ["9M"], + megakick: ["9M"], + metalburst: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + nastyplot: ["9M"], + nightshade: ["9M"], + nightslash: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + phantomforce: ["9M"], + poisonjab: ["9M"], + poltergeist: ["9M"], + powergem: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + quash: ["9M"], + raindance: ["9M"], + recover: ["9M"], + reflect: ["9M"], + rest: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + safeguard: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + shadowpunch: ["9M"], + shadowsneak: ["9M"], + skillswap: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + spite: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + swagger: ["9M"], + taunt: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + torment: ["9M"], + trick: ["9M"], + willowisp: ["9M"], + wonderroom: ["9M"], + xscissor: ["9M"], + zenheadbutt: ["9M"], + }, + }, + aggron: { + learnset: { + ancientpower: ["9M"], + attract: ["9M"], + avalanche: ["9M"], + blizzard: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + crunch: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + dragonclaw: ["9M"], + dragonpulse: ["9M"], + dragonrush: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firepunch: ["9M"], + flamethrower: ["9M"], + flashcannon: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + gigaimpact: ["9M"], + headsmash: ["9M"], + heavyslam: ["9M"], + highhorsepower: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + lowkick: ["9M"], + megakick: ["9M"], + metalburst: ["9M"], + metalsound: ["9M"], + meteorbeam: ["9M"], + mudslap: ["9M"], + outrage: ["9M"], + payback: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roar: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandtomb: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + smartstrike: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + stealthrock: ["9M"], + steelbeam: ["9M"], + steelroller: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + surf: ["9M"], + swagger: ["9M"], + taunt: ["9M"], + thunder: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + uproar: ["9M"], + whirlpool: ["9M"], + }, + }, + medicham: { + learnset: { + acupressure: ["9M"], + aerialace: ["9M"], + agility: ["9M"], + aurasphere: ["9M"], + axekick: ["9M"], + batonpass: ["9M"], + blazekick: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulkup: ["9M"], + bulletpunch: ["9M"], + calmmind: ["9M"], + closecombat: ["9M"], + coaching: ["9M"], + counter: ["9M"], + detect: ["9M"], + drainpunch: ["9M"], + dynamicpunch: ["9M"], + endure: ["9M"], + energyball: ["9M"], + expandingforce: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + feint: ["9M"], + firepunch: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gravity: ["9M"], + guardswap: ["9M"], + helpinghand: ["9M"], + highjumpkick: ["9M"], + hyperbeam: ["9M"], + icepunch: ["9M"], + imprison: ["9M"], + lightscreen: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + megakick: ["9M"], + nightshade: ["9M"], + painsplit: ["9M"], + poisonjab: ["9M"], + powerswap: ["9M"], + powertrick: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psychicterrain: ["9M"], + psychocut: ["9M"], + psyshock: ["9M"], + quickguard: ["9M"], + raindance: ["9M"], + recover: ["9M"], + reflect: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + shadowball: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + taunt: ["9M"], + thief: ["9M"], + thunderpunch: ["9M"], + trailblaze: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + upperhand: ["9M"], + vacuumwave: ["9M"], + zenheadbutt: ["9M"], + }, + }, + manectric: { + learnset: { + agility: ["9M"], + attract: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + charge: ["9M"], + chargebeam: ["9M"], + crunch: ["9M"], + curse: ["9M"], + discharge: ["9M"], + eerieimpulse: ["9M"], + electricterrain: ["9M"], + electroball: ["9M"], + endure: ["9M"], + facade: ["9M"], + firefang: ["9M"], + flamethrower: ["9M"], + gigaimpact: ["9M"], + howl: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icefang: ["9M"], + irontail: ["9M"], + lightscreen: ["9M"], + overheat: ["9M"], + pounce: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + rest: ["9M"], + risingvoltage: ["9M"], + roar: ["9M"], + round: ["9M"], + scaryface: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + substitute: ["9M"], + supercellslam: ["9M"], + switcheroo: ["9M"], + thief: ["9M"], + thunder: ["9M"], + thunderfang: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + trailblaze: ["9M"], + uproar: ["9M"], + voltswitch: ["9M"], + wildcharge: ["9M"], + }, + }, + sharpedo: { + learnset: { + agility: ["9M"], + ancientpower: ["9M"], + aquajet: ["9M"], + assurance: ["9M"], + attract: ["9M"], + avalanche: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + bounce: ["9M"], + bulldoze: ["9M"], + chillingwater: ["9M"], + closecombat: ["9M"], + crunch: ["9M"], + darkpulse: ["9M"], + destinybond: ["9M"], + dive: ["9M"], + doubleedge: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + flipturn: ["9M"], + focusenergy: ["9M"], + gigaimpact: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icefang: ["9M"], + icywind: ["9M"], + liquidation: ["9M"], + nightslash: ["9M"], + payback: ["9M"], + poisonfang: ["9M"], + poisonjab: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + raindance: ["9M"], + rest: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scald: ["9M"], + scaleshot: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + substitute: ["9M"], + surf: ["9M"], + swagger: ["9M"], + taunt: ["9M"], + thrash: ["9M"], + uproar: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + whirlpool: ["9M"], + zenheadbutt: ["9M"], + }, + }, + camerupt: { + learnset: { + amnesia: ["9M"], + ancientpower: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + burningjealousy: ["9M"], + charm: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + eruption: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firespin: ["9M"], + fissure: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + flashcannon: ["9M"], + focusenergy: ["9M"], + gigaimpact: ["9M"], + growth: ["9M"], + heatcrash: ["9M"], + heatwave: ["9M"], + heavyslam: ["9M"], + helpinghand: ["9M"], + highhorsepower: ["9M"], + howl: ["9M"], + hyperbeam: ["9M"], + ironhead: ["9M"], + lashout: ["9M"], + lavaplume: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + overheat: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + scorchingsands: ["9M"], + selfdestruct: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + spitup: ["9M"], + stealthrock: ["9M"], + stockpile: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swallow: ["9M"], + temperflare: ["9M"], + trailblaze: ["9M"], + willowisp: ["9M"], + yawn: ["9M"], + zenheadbutt: ["9M"], + }, + }, + torkoal: { + learnset: { + amnesia: ["9M"], + ancientpower: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + burningjealousy: ["9M"], + clearsmog: ["9M"], + curse: ["9M"], + doubleedge: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + eruption: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firespin: ["9M"], + fissure: ["9M"], + flail: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + gigaimpact: ["9M"], + gyroball: ["9M"], + heatcrash: ["9M"], + heatwave: ["9M"], + heavyslam: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + inferno: ["9M"], + irondefense: ["9M"], + lavaplume: ["9M"], + overheat: ["9M"], + protect: ["9M"], + rapidspin: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scorchingsands: ["9M"], + selfdestruct: ["9M"], + shellsmash: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + stealthrock: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + temperflare: ["9M"], + weatherball: ["9M"], + willowisp: ["9M"], + yawn: ["9M"], + zenheadbutt: ["9M"], + }, + }, + altaria: { + learnset: { + acrobatics: ["9M"], + aerialace: ["9M"], + agility: ["9M"], + alluringvoice: ["9M"], + bodyslam: ["9M"], + bravebird: ["9M"], + breakingswipe: ["9M"], + bulldoze: ["9M"], + cottonguard: ["9M"], + dazzlinggleam: ["9M"], + defog: ["9M"], + doubleedge: ["9M"], + dracometeor: ["9M"], + dragoncheer: ["9M"], + dragonclaw: ["9M"], + dragondance: ["9M"], + dragonpulse: ["9M"], + dragonrush: ["9M"], + dualwingbeat: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + featherdance: ["9M"], + fireblast: ["9M"], + firespin: ["9M"], + flamethrower: ["9M"], + fly: ["9M"], + gigaimpact: ["9M"], + haze: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + hurricane: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icebeam: ["9M"], + moonblast: ["9M"], + outrage: ["9M"], + perishsong: ["9M"], + playrough: ["9M"], + pluck: ["9M"], + powerswap: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roar: ["9M"], + roost: ["9M"], + round: ["9M"], + safeguard: ["9M"], + sing: ["9M"], + skyattack: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + solarbeam: ["9M"], + steelwing: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + tailwind: ["9M"], + thief: ["9M"], + trailblaze: ["9M"], + uproar: ["9M"], + weatherball: ["9M"], + willowisp: ["9M"], + wonderroom: ["9M"], + }, + }, + milotic: { + learnset: { + alluringvoice: ["9M"], + aquaring: ["9M"], + aquatail: ["9M"], + attract: ["9M"], + avalanche: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + chillingwater: ["9M"], + coil: ["9M"], + confuseray: ["9M"], + dive: ["9M"], + doubleedge: ["9M"], + dragoncheer: ["9M"], + dragondance: ["9M"], + dragonpulse: ["9M"], + dragontail: ["9M"], + drainingkiss: ["9M"], + endure: ["9M"], + facade: ["9M"], + flail: ["9M"], + flipturn: ["9M"], + gigaimpact: ["9M"], + haze: ["9M"], + helpinghand: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + hypnosis: ["9M"], + icebeam: ["9M"], + icywind: ["9M"], + imprison: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + lifedew: ["9M"], + lightscreen: ["9M"], + mirrorcoat: ["9M"], + mudshot: ["9M"], + muddywater: ["9M"], + protect: ["9M"], + psychup: ["9M"], + raindance: ["9M"], + recover: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + scald: ["9M"], + scaleshot: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + substitute: ["9M"], + surf: ["9M"], + tickle: ["9M"], + tripleaxel: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + weatherball: ["9M"], + whirlpool: ["9M"], + wrap: ["9M"], + }, + }, + castform: { + learnset: { + amnesia: ["9M"], + attract: ["9M"], + avalanche: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + chillingwater: ["9M"], + cosmicpower: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + flamethrower: ["9M"], + futuresight: ["9M"], + guardswap: ["9M"], + hex: ["9M"], + hurricane: ["9M"], + hydropump: ["9M"], + icebeam: ["9M"], + icywind: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scald: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + solarbeam: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + thief: ["9M"], + thunder: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + weatherball: ["9M"], + }, + }, + banette: { + learnset: { + burningjealousy: ["9M"], + calmmind: ["9M"], + chargebeam: ["9M"], + confuseray: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + dazzlinggleam: ["9M"], + destinybond: ["9M"], + disable: ["9M"], + encore: ["9M"], + endure: ["9M"], + facade: ["9M"], + fling: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + gunkshot: ["9M"], + helpinghand: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + icywind: ["9M"], + imprison: ["9M"], + knockoff: ["9M"], + lashout: ["9M"], + magicroom: ["9M"], + nastyplot: ["9M"], + nightshade: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + phantomforce: ["9M"], + poltergeist: ["9M"], + pounce: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roleplay: ["9M"], + round: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + shadowpunch: ["9M"], + shadowsneak: ["9M"], + skillswap: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + spite: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + swagger: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + thunder: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + torment: ["9M"], + trailblaze: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + willowisp: ["9M"], + zenheadbutt: ["9M"], + }, + }, + chimecho: { + learnset: { + allyswitch: ["9M"], + batonpass: ["9M"], + boomburst: ["9M"], + calmmind: ["9M"], + chargebeam: ["9M"], + charm: ["9M"], + cosmicpower: ["9M"], + curse: ["9M"], + dazzlinggleam: ["9M"], + disable: ["9M"], + doubleedge: ["9M"], + drainingkiss: ["9M"], + encore: ["9M"], + endure: ["9M"], + energyball: ["9M"], + expandingforce: ["9M"], + extrasensory: ["9M"], + facade: ["9M"], + faketears: ["9M"], + flashcannon: ["9M"], + futuresight: ["9M"], + grassknot: ["9M"], + gravity: ["9M"], + healbell: ["9M"], + healpulse: ["9M"], + healingwish: ["9M"], + helpinghand: ["9M"], + hypervoice: ["9M"], + hypnosis: ["9M"], + icywind: ["9M"], + imprison: ["9M"], + knockoff: ["9M"], + lightscreen: ["9M"], + metalsound: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psychicnoise: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + recover: ["9M"], + recycle: ["9M"], + reflect: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + screech: ["9M"], + selfdestruct: ["9M"], + shadowball: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + taunt: ["9M"], + thunderwave: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + uproar: ["9M"], + wish: ["9M"], + wrap: ["9M"], + yawn: ["9M"], + zenheadbutt: ["9M"], + }, + }, + absol: { + learnset: { + aerialace: ["9M"], + airslash: ["9M"], + assurance: ["9M"], + attract: ["9M"], + batonpass: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + bounce: ["9M"], + brutalswing: ["9M"], + calmmind: ["9M"], + closecombat: ["9M"], + confuseray: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + detect: ["9M"], + doubleteam: ["9M"], + doubleedge: ["9M"], + endure: ["9M"], + facade: ["9M"], + feint: ["9M"], + fireblast: ["9M"], + flamethrower: ["9M"], + focusenergy: ["9M"], + foulplay: ["9M"], + futuresight: ["9M"], + gigaimpact: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icywind: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + meanlook: ["9M"], + megahorn: ["9M"], + nightslash: ["9M"], + payback: ["9M"], + perishsong: ["9M"], + phantomforce: ["9M"], + playrough: ["9M"], + protect: ["9M"], + psychocut: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + shadowsneak: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + thunder: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + trailblaze: ["9M"], + willowisp: ["9M"], + xscissor: ["9M"], + zenheadbutt: ["9M"], + }, + }, + glalie: { + learnset: { + avalanche: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + block: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + chillingwater: ["9M"], + crunch: ["9M"], + darkpulse: ["9M"], + disable: ["9M"], + doubleteam: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + explosion: ["9M"], + facade: ["9M"], + faketears: ["9M"], + foulplay: ["9M"], + freezedry: ["9M"], + frostbreath: ["9M"], + gigaimpact: ["9M"], + gyroball: ["9M"], + helpinghand: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icefang: ["9M"], + iceshard: ["9M"], + icespinner: ["9M"], + iciclecrash: ["9M"], + iciclespear: ["9M"], + icywind: ["9M"], + ironhead: ["9M"], + lightscreen: ["9M"], + payback: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + round: ["9M"], + scaryface: ["9M"], + selfdestruct: ["9M"], + shadowball: ["9M"], + sheercold: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + spikes: ["9M"], + spite: ["9M"], + steelroller: ["9M"], + substitute: ["9M"], + switcheroo: ["9M"], + taunt: ["9M"], + trailblaze: ["9M"], + waterpulse: ["9M"], + weatherball: ["9M"], + }, + }, + torterra: { + learnset: { + amnesia: ["9M"], + attract: ["9M"], + bite: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + bulletseed: ["9M"], + crunch: ["9M"], + curse: ["9M"], + doubleedge: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + frenzyplant: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + grassyterrain: ["9M"], + growth: ["9M"], + hardpress: ["9M"], + headlongrush: ["9M"], + heavyslam: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + leafstorm: ["9M"], + leechseed: ["9M"], + lightscreen: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + outrage: ["9M"], + protect: ["9M"], + reflect: ["9M"], + rest: ["9M"], + roar: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandtomb: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + scorchingsands: ["9M"], + seedbomb: ["9M"], + shellsmash: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + spitup: ["9M"], + stealthrock: ["9M"], + stockpile: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + swallow: ["9M"], + swordsdance: ["9M"], + synthesis: ["9M"], + thrash: ["9M"], + tickle: ["9M"], + trailblaze: ["9M"], + wideguard: ["9M"], + woodhammer: ["9M"], + worryseed: ["9M"], + zenheadbutt: ["9M"], + }, + }, + infernape: { + learnset: { + acrobatics: ["9M"], + aerialace: ["9M"], + agility: ["9M"], + attract: ["9M"], + aurasphere: ["9M"], + blastburn: ["9M"], + blazekick: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + burningjealousy: ["9M"], + calmmind: ["9M"], + closecombat: ["9M"], + coaching: ["9M"], + counter: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + drainpunch: ["9M"], + earthquake: ["9M"], + encore: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + faketears: ["9M"], + feint: ["9M"], + fireblast: ["9M"], + firepunch: ["9M"], + firespin: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focusenergy: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gunkshot: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + lashout: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + machpunch: ["9M"], + mudslap: ["9M"], + nastyplot: ["9M"], + overheat: ["9M"], + poisonjab: ["9M"], + protect: ["9M"], + psychup: ["9M"], + ragingfury: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scaryface: ["9M"], + scorchingsands: ["9M"], + shadowclaw: ["9M"], + slackoff: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + stealthrock: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + switcheroo: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + temperflare: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + thunderpunch: ["9M"], + torment: ["9M"], + uturn: ["9M"], + upperhand: ["9M"], + uproar: ["9M"], + vacuumwave: ["9M"], + willowisp: ["9M"], + zenheadbutt: ["9M"], + }, + }, + empoleon: { + learnset: { + aerialace: ["9M"], + agility: ["9M"], + aircutter: ["9M"], + airslash: ["9M"], + aquajet: ["9M"], + aquaring: ["9M"], + attract: ["9M"], + avalanche: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulldoze: ["9M"], + charm: ["9M"], + chillingwater: ["9M"], + dig: ["9M"], + dive: ["9M"], + doubleedge: ["9M"], + drillpeck: ["9M"], + dualwingbeat: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + featherdance: ["9M"], + flashcannon: ["9M"], + fling: ["9M"], + flipturn: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + haze: ["9M"], + helpinghand: ["9M"], + hydrocannon: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icespinner: ["9M"], + icywind: ["9M"], + irondefense: ["9M"], + knockoff: ["9M"], + lashout: ["9M"], + liquidation: ["9M"], + metalsound: ["9M"], + mudslap: ["9M"], + powertrip: ["9M"], + protect: ["9M"], + psychup: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + roost: ["9M"], + round: ["9M"], + scaryface: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + stealthrock: ["9M"], + steelbeam: ["9M"], + steelwing: ["9M"], + substitute: ["9M"], + surf: ["9M"], + swagger: ["9M"], + swordsdance: ["9M"], + throatchop: ["9M"], + tripleaxel: ["9M"], + uproar: ["9M"], + vacuumwave: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + wavecrash: ["9M"], + weatherball: ["9M"], + whirlpool: ["9M"], + yawn: ["9M"], + }, + }, + luxray: { + learnset: { + agility: ["9M"], + babydolleyes: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + charge: ["9M"], + chargebeam: ["9M"], + confuseray: ["9M"], + crunch: ["9M"], + discharge: ["9M"], + doubleedge: ["9M"], + eerieimpulse: ["9M"], + electricterrain: ["9M"], + electroball: ["9M"], + electroweb: ["9M"], + endure: ["9M"], + facade: ["9M"], + faketears: ["9M"], + firefang: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + howl: ["9M"], + hyperbeam: ["9M"], + icefang: ["9M"], + irontail: ["9M"], + lightscreen: ["9M"], + nightslash: ["9M"], + playrough: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + rest: ["9M"], + risingvoltage: ["9M"], + roar: ["9M"], + round: ["9M"], + scaryface: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + supercellslam: ["9M"], + superpower: ["9M"], + swagger: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + thunder: ["9M"], + thunderfang: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + trailblaze: ["9M"], + voltswitch: ["9M"], + wildcharge: ["9M"], + }, + }, + roserade: { + learnset: { + attract: ["9M"], + bodyslam: ["9M"], + bulletseed: ["9M"], + charm: ["9M"], + cottonspore: ["9M"], + dazzlinggleam: ["9M"], + endure: ["9M"], + energyball: ["9M"], + extrasensory: ["9M"], + facade: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + grassyterrain: ["9M"], + growth: ["9M"], + hyperbeam: ["9M"], + ingrain: ["9M"], + leafstorm: ["9M"], + leechseed: ["9M"], + lifedew: ["9M"], + petalblizzard: ["9M"], + petaldance: ["9M"], + pinmissile: ["9M"], + poisonjab: ["9M"], + powerwhip: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + round: ["9M"], + seedbomb: ["9M"], + shadowball: ["9M"], + sleeppowder: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + spikes: ["9M"], + stunspore: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + sweetscent: ["9M"], + swordsdance: ["9M"], + synthesis: ["9M"], + toxic: ["9M"], + toxicspikes: ["9M"], + trailblaze: ["9M"], + uproar: ["9M"], + venoshock: ["9M"], + weatherball: ["9M"], + worryseed: ["9M"], + }, + }, + rampardos: { + learnset: { + ancientpower: ["9M"], + assurance: ["9M"], + attract: ["9M"], + avalanche: ["9M"], + blizzard: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + brickbreak: ["9M"], + bulldoze: ["9M"], + crunch: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + dragoncheer: ["9M"], + dragonclaw: ["9M"], + dragonpulse: ["9M"], + dragontail: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firepunch: ["9M"], + flamethrower: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focusenergy: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + hammerarm: ["9M"], + headsmash: ["9M"], + heavyslam: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + meteorbeam: ["9M"], + mudslap: ["9M"], + outrage: ["9M"], + payback: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roar: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + stealthrock: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + supercellslam: ["9M"], + superpower: ["9M"], + surf: ["9M"], + swordsdance: ["9M"], + thief: ["9M"], + thrash: ["9M"], + thunder: ["9M"], + thunderpunch: ["9M"], + thunderbolt: ["9M"], + trailblaze: ["9M"], + uproar: ["9M"], + whirlwind: ["9M"], + zenheadbutt: ["9M"], + }, + }, + bastiodon: { + learnset: { + ancientpower: ["9M"], + attract: ["9M"], + avalanche: ["9M"], + blizzard: ["9M"], + block: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + counter: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + fissure: ["9M"], + flamethrower: ["9M"], + flashcannon: ["9M"], + focusenergy: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + guardsplit: ["9M"], + hardpress: ["9M"], + heavyslam: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + metalburst: ["9M"], + metalsound: ["9M"], + meteorbeam: ["9M"], + mudslap: ["9M"], + outrage: ["9M"], + powergem: ["9M"], + protect: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roar: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandtomb: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + scorchingsands: ["9M"], + screech: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + stealthrock: ["9M"], + steelbeam: ["9M"], + steelroller: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swagger: ["9M"], + taunt: ["9M"], + thunder: ["9M"], + thunderbolt: ["9M"], + trailblaze: ["9M"], + wideguard: ["9M"], + }, + }, + lopunny: { + learnset: { + acrobatics: ["9M"], + afteryou: ["9M"], + agility: ["9M"], + assurance: ["9M"], + attract: ["9M"], + aurasphere: ["9M"], + babydolleyes: ["9M"], + batonpass: ["9M"], + blizzard: ["9M"], + bounce: ["9M"], + brutalswing: ["9M"], + charm: ["9M"], + circlethrow: ["9M"], + closecombat: ["9M"], + copycat: ["9M"], + cosmicpower: ["9M"], + cottonguard: ["9M"], + dig: ["9M"], + doublehit: ["9M"], + drainpunch: ["9M"], + drainingkiss: ["9M"], + dynamicpunch: ["9M"], + encore: ["9M"], + endure: ["9M"], + entrainment: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + faketears: ["9M"], + firepunch: ["9M"], + flail: ["9M"], + flatter: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + healingwish: ["9M"], + helpinghand: ["9M"], + highjumpkick: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icebeam: ["9M"], + icepunch: ["9M"], + irontail: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + machpunch: ["9M"], + megakick: ["9M"], + mirrorcoat: ["9M"], + payback: ["9M"], + playrough: ["9M"], + pounce: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + round: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + sweetkiss: ["9M"], + switcheroo: ["9M"], + swordsdance: ["9M"], + teeterdance: ["9M"], + thunder: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + trailblaze: ["9M"], + tripleaxel: ["9M"], + uturn: ["9M"], + uproar: ["9M"], + }, + }, + spiritomb: { + learnset: { + allyswitch: ["9M"], + bodyslam: ["9M"], + burningjealousy: ["9M"], + calmmind: ["9M"], + confuseray: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + destinybond: ["9M"], + disable: ["9M"], + endure: ["9M"], + facade: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + hypnosis: ["9M"], + icywind: ["9M"], + imprison: ["9M"], + lashout: ["9M"], + memento: ["9M"], + nastyplot: ["9M"], + nightshade: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + phantomforce: ["9M"], + poltergeist: ["9M"], + protect: ["9M"], + psychic: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + rest: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scaryface: ["9M"], + shadowball: ["9M"], + shadowsneak: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + spite: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + taunt: ["9M"], + thief: ["9M"], + toxic: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + uproar: ["9M"], + willowisp: ["9M"], + wonderroom: ["9M"], + }, + }, + garchomp: { + learnset: { + aerialace: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + crunch: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + dracometeor: ["9M"], + dragoncheer: ["9M"], + dragonclaw: ["9M"], + dragonpulse: ["9M"], + dragonrush: ["9M"], + dragontail: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firefang: ["9M"], + flamethrower: ["9M"], + fling: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + liquidation: ["9M"], + mudshot: ["9M"], + outrage: ["9M"], + poisonjab: ["9M"], + powergem: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandtomb: ["9M"], + sandstorm: ["9M"], + scaleshot: ["9M"], + scaryface: ["9M"], + scorchingsands: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + spikes: ["9M"], + stealthrock: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + surf: ["9M"], + swordsdance: ["9M"], + thrash: ["9M"], + thunderfang: ["9M"], + }, + }, + lucario: { + learnset: { + aerialace: ["9M"], + agility: ["9M"], + aurasphere: ["9M"], + bite: ["9M"], + blazekick: ["9M"], + bodyslam: ["9M"], + bonerush: ["9M"], + brickbreak: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + bulletpunch: ["9M"], + calmmind: ["9M"], + circlethrow: ["9M"], + closecombat: ["9M"], + coaching: ["9M"], + copycat: ["9M"], + counter: ["9M"], + crosschop: ["9M"], + crunch: ["9M"], + darkpulse: ["9M"], + detect: ["9M"], + dig: ["9M"], + dragonpulse: ["9M"], + drainpunch: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + extremespeed: ["9M"], + facade: ["9M"], + feint: ["9M"], + finalgambit: ["9M"], + flashcannon: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focusenergy: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + healpulse: ["9M"], + helpinghand: ["9M"], + highjumpkick: ["9M"], + howl: ["9M"], + hyperbeam: ["9M"], + icepunch: ["9M"], + irondefense: ["9M"], + irontail: ["9M"], + lifedew: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + megakick: ["9M"], + metalsound: ["9M"], + meteormash: ["9M"], + nastyplot: ["9M"], + payback: ["9M"], + poisonjab: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + quickattack: ["9M"], + quickguard: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + steelbeam: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + terrainpulse: ["9M"], + thunderpunch: ["9M"], + trailblaze: ["9M"], + upperhand: ["9M"], + vacuumwave: ["9M"], + waterpulse: ["9M"], + zenheadbutt: ["9M"], + }, + }, + hippowdon: { + learnset: { + amnesia: ["9M"], + bite: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + crunch: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + firefang: ["9M"], + fissure: ["9M"], + gigaimpact: ["9M"], + hardpress: ["9M"], + heavyslam: ["9M"], + helpinghand: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icefang: ["9M"], + ironhead: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + muddywater: ["9M"], + protect: ["9M"], + rest: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandtomb: ["9M"], + sandstorm: ["9M"], + scorchingsands: ["9M"], + slackoff: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + spitup: ["9M"], + stealthrock: ["9M"], + stockpile: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + swallow: ["9M"], + thunderfang: ["9M"], + whirlwind: ["9M"], + yawn: ["9M"], + }, + }, + toxicroak: { + learnset: { + acidspray: ["9M"], + aerialace: ["9M"], + assurance: ["9M"], + batonpass: ["9M"], + belch: ["9M"], + bounce: ["9M"], + brickbreak: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + bulletpunch: ["9M"], + chillingwater: ["9M"], + closecombat: ["9M"], + coaching: ["9M"], + corrosivegas: ["9M"], + counter: ["9M"], + crosschop: ["9M"], + crosspoison: ["9M"], + darkpulse: ["9M"], + dig: ["9M"], + drainpunch: ["9M"], + dynamicpunch: ["9M"], + earthquake: ["9M"], + encore: ["9M"], + endure: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + feint: ["9M"], + flatter: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + gunkshot: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + knockoff: ["9M"], + lashout: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + megakick: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + nastyplot: ["9M"], + payback: ["9M"], + poisonjab: ["9M"], + protect: ["9M"], + quickguard: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + sludgewave: ["9M"], + snore: ["9M"], + spite: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + superfang: ["9M"], + swagger: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + thunderpunch: ["9M"], + toxic: ["9M"], + upperhand: ["9M"], + vacuumwave: ["9M"], + venoshock: ["9M"], + xscissor: ["9M"], + }, + }, + abomasnow: { + learnset: { + auroraveil: ["9M"], + avalanche: ["9M"], + blizzard: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulldoze: ["9M"], + bulletseed: ["9M"], + chillingwater: ["9M"], + curse: ["9M"], + doubleedge: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + frostbreath: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + growth: ["9M"], + hardpress: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icehammer: ["9M"], + icepunch: ["9M"], + iceshard: ["9M"], + icespinner: ["9M"], + iciclespear: ["9M"], + icywind: ["9M"], + ingrain: ["9M"], + irontail: ["9M"], + leafstorm: ["9M"], + leechseed: ["9M"], + lowkick: ["9M"], + megakick: ["9M"], + mudslap: ["9M"], + outrage: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scaryface: ["9M"], + seedbomb: ["9M"], + shadowball: ["9M"], + sheercold: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + solarbeam: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + swagger: ["9M"], + swordsdance: ["9M"], + trailblaze: ["9M"], + waterpulse: ["9M"], + weatherball: ["9M"], + woodhammer: ["9M"], + }, + }, + weavile: { + learnset: { + aerialace: ["9M"], + agility: ["9M"], + assurance: ["9M"], + avalanche: ["9M"], + batonpass: ["9M"], + beatup: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + brickbreak: ["9M"], + calmmind: ["9M"], + chillingwater: ["9M"], + counter: ["9M"], + darkpulse: ["9M"], + dig: ["9M"], + doublehit: ["9M"], + endure: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + faketears: ["9M"], + feint: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icepunch: ["9M"], + iceshard: ["9M"], + icespinner: ["9M"], + iciclecrash: ["9M"], + iciclespear: ["9M"], + icywind: ["9M"], + knockoff: ["9M"], + lashout: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + megakick: ["9M"], + nastyplot: ["9M"], + nightslash: ["9M"], + payback: ["9M"], + poisonjab: ["9M"], + protect: ["9M"], + psychocut: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + reversal: ["9M"], + round: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + spite: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + surf: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + trailblaze: ["9M"], + tripleaxel: ["9M"], + upperhand: ["9M"], + waterpulse: ["9M"], + xscissor: ["9M"], + }, + }, + rhyperior: { + learnset: { + avalanche: ["9M"], + blizzard: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + counter: ["9M"], + crunch: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + dragonpulse: ["9M"], + dragonrush: ["9M"], + dragontail: ["9M"], + drillrun: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firefang: ["9M"], + firepunch: ["9M"], + flamethrower: ["9M"], + flashcannon: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + guardsplit: ["9M"], + hammerarm: ["9M"], + heatcrash: ["9M"], + heavyslam: ["9M"], + helpinghand: ["9M"], + highhorsepower: ["9M"], + horndrill: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icefang: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + megakick: ["9M"], + megahorn: ["9M"], + metalburst: ["9M"], + meteorbeam: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + outrage: ["9M"], + payback: ["9M"], + poisonjab: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roar: ["9M"], + rockblast: ["9M"], + rockpolish: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + rockwrecker: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + scorchingsands: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + smartstrike: ["9M"], + snore: ["9M"], + stealthrock: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + supercellslam: ["9M"], + superpower: ["9M"], + surf: ["9M"], + swordsdance: ["9M"], + temperflare: ["9M"], + thief: ["9M"], + thunder: ["9M"], + thunderfang: ["9M"], + thunderpunch: ["9M"], + thunderbolt: ["9M"], + uproar: ["9M"], + }, + }, + leafeon: { + learnset: { + aerialace: ["9M"], + alluringvoice: ["9M"], + babydolleyes: ["9M"], + batonpass: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + bulletseed: ["9M"], + calmmind: ["9M"], + charm: ["9M"], + copycat: ["9M"], + covet: ["9M"], + curse: ["9M"], + detect: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + faketears: ["9M"], + flail: ["9M"], + focusenergy: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + knockoff: ["9M"], + lastresort: ["9M"], + leafblade: ["9M"], + leafstorm: ["9M"], + leechseed: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roar: ["9M"], + round: ["9M"], + seedbomb: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + solarblade: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + synthesis: ["9M"], + tickle: ["9M"], + trailblaze: ["9M"], + weatherball: ["9M"], + wish: ["9M"], + xscissor: ["9M"], + yawn: ["9M"], + }, + }, + glaceon: { + learnset: { + alluringvoice: ["9M"], + avalanche: ["9M"], + babydolleyes: ["9M"], + batonpass: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + calmmind: ["9M"], + charm: ["9M"], + chillingwater: ["9M"], + copycat: ["9M"], + covet: ["9M"], + curse: ["9M"], + detect: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + endure: ["9M"], + facade: ["9M"], + faketears: ["9M"], + flail: ["9M"], + focusenergy: ["9M"], + freezedry: ["9M"], + frostbreath: ["9M"], + gigaimpact: ["9M"], + gravity: ["9M"], + haze: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icebeam: ["9M"], + icefang: ["9M"], + iceshard: ["9M"], + iciclespear: ["9M"], + icywind: ["9M"], + lastresort: ["9M"], + mirrorcoat: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roar: ["9M"], + round: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + tickle: ["9M"], + trailblaze: ["9M"], + tripleaxel: ["9M"], + waterpulse: ["9M"], + weatherball: ["9M"], + wish: ["9M"], + yawn: ["9M"], + }, + }, + gliscor: { + learnset: { + acrobatics: ["9M"], + aerialace: ["9M"], + agility: ["9M"], + assurance: ["9M"], + attract: ["9M"], + batonpass: ["9M"], + breakingswipe: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + counter: ["9M"], + crabhammer: ["9M"], + crosspoison: ["9M"], + crunch: ["9M"], + darkpulse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + dualwingbeat: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + feint: ["9M"], + firefang: ["9M"], + fling: ["9M"], + gigaimpact: ["9M"], + gunkshot: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + icefang: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + lunge: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + nightslash: ["9M"], + payback: ["9M"], + pinmissile: ["9M"], + poisonjab: ["9M"], + powerwhip: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandtomb: ["9M"], + sandstorm: ["9M"], + scaleshot: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + snore: ["9M"], + spikes: ["9M"], + stealthrock: ["9M"], + steelwing: ["9M"], + stoneedge: ["9M"], + strugglebug: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + tailwind: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + thunderfang: ["9M"], + toxic: ["9M"], + toxicspikes: ["9M"], + uturn: ["9M"], + venoshock: ["9M"], + xscissor: ["9M"], + }, + }, + mamoswine: { + learnset: { + amnesia: ["9M"], + ancientpower: ["9M"], + attract: ["9M"], + avalanche: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + charm: ["9M"], + curse: ["9M"], + dig: ["9M"], + doublehit: ["9M"], + doubleedge: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fissure: ["9M"], + flail: ["9M"], + freezedry: ["9M"], + gigaimpact: ["9M"], + hardpress: ["9M"], + haze: ["9M"], + heavyslam: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icefang: ["9M"], + iceshard: ["9M"], + iciclecrash: ["9M"], + iciclespear: ["9M"], + icywind: ["9M"], + ironhead: ["9M"], + knockoff: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + protect: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roar: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandtomb: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + stealthrock: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + superpower: ["9M"], + thrash: ["9M"], + throatchop: ["9M"], + trailblaze: ["9M"], + }, + }, + gallade: { + learnset: { + aerialace: ["9M"], + agility: ["9M"], + airslash: ["9M"], + alluringvoice: ["9M"], + aquacutter: ["9M"], + aurasphere: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + calmmind: ["9M"], + chargebeam: ["9M"], + charm: ["9M"], + closecombat: ["9M"], + coaching: ["9M"], + confuseray: ["9M"], + dazzlinggleam: ["9M"], + destinybond: ["9M"], + disable: ["9M"], + doubleteam: ["9M"], + drainpunch: ["9M"], + drainingkiss: ["9M"], + earthquake: ["9M"], + encore: ["9M"], + endure: ["9M"], + energyball: ["9M"], + expandingforce: ["9M"], + facade: ["9M"], + feint: ["9M"], + firepunch: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + futuresight: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + healpulse: ["9M"], + helpinghand: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + hypnosis: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + imprison: ["9M"], + knockoff: ["9M"], + leafblade: ["9M"], + lifedew: ["9M"], + lightscreen: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + magicroom: ["9M"], + meanlook: ["9M"], + megakick: ["9M"], + memento: ["9M"], + mistyterrain: ["9M"], + mysticalfire: ["9M"], + nightshade: ["9M"], + nightslash: ["9M"], + painsplit: ["9M"], + poisonjab: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psychicterrain: ["9M"], + psychocut: ["9M"], + psyshock: ["9M"], + quickguard: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sacredsword: ["9M"], + safeguard: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + shadowsneak: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarblade: ["9M"], + stoneedge: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + tripleaxel: ["9M"], + upperhand: ["9M"], + vacuumwave: ["9M"], + wideguard: ["9M"], + willowisp: ["9M"], + wonderroom: ["9M"], + xscissor: ["9M"], + zenheadbutt: ["9M"], + }, + }, + froslass: { + learnset: { + auroraveil: ["9M"], + avalanche: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + block: ["9M"], + bodyslam: ["9M"], + charm: ["9M"], + chillingwater: ["9M"], + confuseray: ["9M"], + crunch: ["9M"], + curse: ["9M"], + destinybond: ["9M"], + disable: ["9M"], + doubleteam: ["9M"], + drainingkiss: ["9M"], + endure: ["9M"], + facade: ["9M"], + faketears: ["9M"], + fling: ["9M"], + frostbreath: ["9M"], + gigaimpact: ["9M"], + haze: ["9M"], + helpinghand: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icefang: ["9M"], + icepunch: ["9M"], + iceshard: ["9M"], + icespinner: ["9M"], + iciclecrash: ["9M"], + iciclespear: ["9M"], + icywind: ["9M"], + imprison: ["9M"], + lightscreen: ["9M"], + nastyplot: ["9M"], + nightshade: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + phantomforce: ["9M"], + poltergeist: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + scaryface: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + spikes: ["9M"], + spite: ["9M"], + substitute: ["9M"], + switcheroo: ["9M"], + taunt: ["9M"], + thunder: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + trailblaze: ["9M"], + trick: ["9M"], + tripleaxel: ["9M"], + waterpulse: ["9M"], + weatherball: ["9M"], + willowisp: ["9M"], + }, + }, + rotom: { + learnset: { + charge: ["9M"], + chargebeam: ["9M"], + confuseray: ["9M"], + darkpulse: ["9M"], + discharge: ["9M"], + doubleteam: ["9M"], + eerieimpulse: ["9M"], + electricterrain: ["9M"], + electroball: ["9M"], + electroweb: ["9M"], + endure: ["9M"], + facade: ["9M"], + foulplay: ["9M"], + helpinghand: ["9M"], + hex: ["9M"], + hypervoice: ["9M"], + lightscreen: ["9M"], + nastyplot: ["9M"], + nightshade: ["9M"], + painsplit: ["9M"], + poltergeist: ["9M"], + protect: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + risingvoltage: ["9M"], + round: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + spite: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + thief: ["9M"], + thunder: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + trick: ["9M"], + uproar: ["9M"], + voltswitch: ["9M"], + willowisp: ["9M"], + }, + }, + rotomheat: { + learnset: { + overheat: ["9R"], + }, + }, + rotomwash: { + learnset: { + hydropump: ["9R"], + }, + }, + rotomfrost: { + learnset: { + blizzard: ["9R"], + }, + }, + rotomfan: { + learnset: { + airslash: ["9R"], + }, + }, + rotommow: { + learnset: { + leafstorm: ["9R"], + }, + }, + serperior: { + learnset: { + aerialace: ["9M"], + attract: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + brutalswing: ["9M"], + bulletseed: ["9M"], + calmmind: ["9M"], + coil: ["9M"], + doubleedge: ["9M"], + dragonpulse: ["9M"], + dragontail: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + frenzyplant: ["9M"], + gastroacid: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + glare: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + grassyterrain: ["9M"], + growth: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + leafblade: ["9M"], + leafstorm: ["9M"], + leechseed: ["9M"], + lightscreen: ["9M"], + meanlook: ["9M"], + mirrorcoat: ["9M"], + outrage: ["9M"], + petalblizzard: ["9M"], + protect: ["9M"], + reflect: ["9M"], + rest: ["9M"], + round: ["9M"], + scaleshot: ["9M"], + scaryface: ["9M"], + seedbomb: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + sweetscent: ["9M"], + swordsdance: ["9M"], + synthesis: ["9M"], + taunt: ["9M"], + trailblaze: ["9M"], + wrap: ["9M"], + }, + }, + emboar: { + learnset: { + assurance: ["9M"], + blastburn: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + burnup: ["9M"], + closecombat: ["9M"], + coaching: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + drainpunch: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firepunch: ["9M"], + firespin: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focusenergy: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gyroball: ["9M"], + hammerarm: ["9M"], + hardpress: ["9M"], + headsmash: ["9M"], + heatcrash: ["9M"], + heatwave: ["9M"], + heavyslam: ["9M"], + helpinghand: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + mudslap: ["9M"], + overheat: ["9M"], + poisonjab: ["9M"], + protect: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scald: ["9M"], + scaryface: ["9M"], + scorchingsands: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + solarblade: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + stormthrow: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + taunt: ["9M"], + temperflare: ["9M"], + thrash: ["9M"], + thunderpunch: ["9M"], + trailblaze: ["9M"], + wildcharge: ["9M"], + willowisp: ["9M"], + yawn: ["9M"], + zenheadbutt: ["9M"], + }, + }, + samurott: { + learnset: { + aerialace: ["9M"], + airslash: ["9M"], + aquacutter: ["9M"], + aquajet: ["9M"], + aquatail: ["9M"], + assurance: ["9M"], + avalanche: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulldoze: ["9M"], + chillingwater: ["9M"], + copycat: ["9M"], + detect: ["9M"], + dig: ["9M"], + dive: ["9M"], + drillrun: ["9M"], + encore: ["9M"], + endure: ["9M"], + facade: ["9M"], + fling: ["9M"], + flipturn: ["9M"], + focusenergy: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + helpinghand: ["9M"], + hydrocannon: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icywind: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + liquidation: ["9M"], + megahorn: ["9M"], + nightslash: ["9M"], + protect: ["9M"], + raindance: ["9M"], + razorshell: ["9M"], + rest: ["9M"], + round: ["9M"], + sacredsword: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + sleeptalk: ["9M"], + smartstrike: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + soak: ["9M"], + substitute: ["9M"], + superpower: ["9M"], + surf: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + thief: ["9M"], + upperhand: ["9M"], + vacuumwave: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + whirlpool: ["9M"], + xscissor: ["9M"], + }, + }, + samurotthisui: { + learnset: { + aerialace: ["9M"], + airslash: ["9M"], + aquacutter: ["9M"], + aquajet: ["9M"], + aquatail: ["9M"], + assurance: ["9M"], + avalanche: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulldoze: ["9M"], + ceaselessedge: ["9M"], + chillingwater: ["9M"], + copycat: ["9M"], + darkpulse: ["9M"], + detect: ["9M"], + dig: ["9M"], + dive: ["9M"], + drillrun: ["9M"], + encore: ["9M"], + endure: ["9M"], + facade: ["9M"], + fling: ["9M"], + flipturn: ["9M"], + focusenergy: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + helpinghand: ["9M"], + hydrocannon: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icywind: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + lashout: ["9M"], + liquidation: ["9M"], + megahorn: ["9M"], + nightslash: ["9M"], + protect: ["9M"], + raindance: ["9M"], + razorshell: ["9M"], + rest: ["9M"], + round: ["9M"], + sacredsword: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + sleeptalk: ["9M"], + smartstrike: ["9M"], + snarl: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + soak: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + superpower: ["9M"], + surf: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + upperhand: ["9M"], + vacuumwave: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + whirlpool: ["9M"], + xscissor: ["9M"], + }, + }, + watchog: { + learnset: { + afteryou: ["9M"], + assurance: ["9M"], + attract: ["9M"], + batonpass: ["9M"], + bite: ["9M"], + bulletseed: ["9M"], + confuseray: ["9M"], + crunch: ["9M"], + detect: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + endure: ["9M"], + facade: ["9M"], + firepunch: ["9M"], + flamethrower: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focusenergy: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gunkshot: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + hypnosis: ["9M"], + icepunch: ["9M"], + irontail: ["9M"], + lightscreen: ["9M"], + lowkick: ["9M"], + meanlook: ["9M"], + mudshot: ["9M"], + nastyplot: ["9M"], + protect: ["9M"], + psychup: ["9M"], + raindance: ["9M"], + rest: ["9M"], + round: ["9M"], + screech: ["9M"], + seedbomb: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superfang: ["9M"], + swordsdance: ["9M"], + thunder: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + trailblaze: ["9M"], + zenheadbutt: ["9M"], + }, + }, + liepard: { + learnset: { + assurance: ["9M"], + attract: ["9M"], + batonpass: ["9M"], + bite: ["9M"], + burningjealousy: ["9M"], + charm: ["9M"], + copycat: ["9M"], + covet: ["9M"], + crunch: ["9M"], + darkpulse: ["9M"], + doubleteam: ["9M"], + encore: ["9M"], + endure: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + faketears: ["9M"], + firefang: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gunkshot: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icefang: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + lashout: ["9M"], + nastyplot: ["9M"], + nightslash: ["9M"], + payback: ["9M"], + playrough: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + psychocut: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + rest: ["9M"], + round: ["9M"], + screech: ["9M"], + seedbomb: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + swagger: ["9M"], + taunt: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + thunderfang: ["9M"], + thunderwave: ["9M"], + torment: ["9M"], + trailblaze: ["9M"], + trick: ["9M"], + uturn: ["9M"], + yawn: ["9M"], + }, + }, + simisage: { + learnset: { + acrobatics: ["9M"], + attract: ["9M"], + belch: ["9M"], + bite: ["9M"], + brickbreak: ["9M"], + bulletseed: ["9M"], + crunch: ["9M"], + dig: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + gunkshot: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + irontail: ["9M"], + leafstorm: ["9M"], + leechseed: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + nastyplot: ["9M"], + payback: ["9M"], + protect: ["9M"], + recycle: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + seedbomb: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + solarblade: ["9M"], + stuffcheeks: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + taunt: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + torment: ["9M"], + trailblaze: ["9M"], + uproar: ["9M"], + }, + }, + simisear: { + learnset: { + acrobatics: ["9M"], + amnesia: ["9M"], + attract: ["9M"], + belch: ["9M"], + bite: ["9M"], + blazekick: ["9M"], + brickbreak: ["9M"], + burningjealousy: ["9M"], + crunch: ["9M"], + dig: ["9M"], + endure: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + fireblast: ["9M"], + firepunch: ["9M"], + firespin: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gunkshot: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + irontail: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + nastyplot: ["9M"], + overheat: ["9M"], + payback: ["9M"], + protect: ["9M"], + recycle: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scorchingsands: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + stuffcheeks: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + taunt: ["9M"], + temperflare: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + uproar: ["9M"], + willowisp: ["9M"], + yawn: ["9M"], + }, + }, + simipour: { + learnset: { + acrobatics: ["9M"], + aquaring: ["9M"], + attract: ["9M"], + belch: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + brickbreak: ["9M"], + chillingwater: ["9M"], + crunch: ["9M"], + dig: ["9M"], + dive: ["9M"], + endure: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + fling: ["9M"], + flipturn: ["9M"], + focusblast: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gunkshot: ["9M"], + helpinghand: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + irontail: ["9M"], + liquidation: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + nastyplot: ["9M"], + payback: ["9M"], + protect: ["9M"], + raindance: ["9M"], + recycle: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scald: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + stuffcheeks: ["9M"], + substitute: ["9M"], + superpower: ["9M"], + surf: ["9M"], + taunt: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + uproar: ["9M"], + waterfall: ["9M"], + }, + }, + excadrill: { + learnset: { + aerialace: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + crushclaw: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + drillrun: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + fissure: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + highhorsepower: ["9M"], + horndrill: ["9M"], + hyperbeam: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + megahorn: ["9M"], + metalsound: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + poisonjab: ["9M"], + protect: ["9M"], + rapidspin: ["9M"], + rest: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandtomb: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + scorchingsands: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + smartstrike: ["9M"], + snore: ["9M"], + stealthrock: ["9M"], + steelbeam: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + throatchop: ["9M"], + xscissor: ["9M"], + }, + }, + audino: { + learnset: { + afteryou: ["9M"], + allyswitch: ["9M"], + amnesia: ["9M"], + attract: ["9M"], + babydolleyes: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + calmmind: ["9M"], + chillingwater: ["9M"], + dazzlinggleam: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + drainpunch: ["9M"], + drainingkiss: ["9M"], + encore: ["9M"], + endure: ["9M"], + entrainment: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firepunch: ["9M"], + flamethrower: ["9M"], + fling: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + healpulse: ["9M"], + healingwish: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icebeam: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + irontail: ["9M"], + lastresort: ["9M"], + lifedew: ["9M"], + lightscreen: ["9M"], + lowkick: ["9M"], + megakick: ["9M"], + mistyterrain: ["9M"], + protect: ["9M"], + psychic: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + shadowball: ["9M"], + simplebeam: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + surf: ["9M"], + sweetkiss: ["9M"], + throatchop: ["9M"], + thunder: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + trickroom: ["9M"], + uproar: ["9M"], + wildcharge: ["9M"], + wish: ["9M"], + yawn: ["9M"], + zenheadbutt: ["9M"], + }, + }, + conkeldurr: { + learnset: { + attract: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + closecombat: ["9M"], + coaching: ["9M"], + counter: ["9M"], + curse: ["9M"], + defog: ["9M"], + detect: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + drainpunch: ["9M"], + dynamicpunch: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + firepunch: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focusenergy: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + hammerarm: ["9M"], + hardpress: ["9M"], + helpinghand: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + icepunch: ["9M"], + knockoff: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + machpunch: ["9M"], + megakick: ["9M"], + payback: ["9M"], + poisonjab: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scaryface: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + taunt: ["9M"], + thief: ["9M"], + thunderpunch: ["9M"], + upperhand: ["9M"], + wideguard: ["9M"], + }, + }, + whimsicott: { + learnset: { + attract: ["9M"], + beatup: ["9M"], + charm: ["9M"], + cottonguard: ["9M"], + cottonspore: ["9M"], + dazzlinggleam: ["9M"], + encore: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + faketears: ["9M"], + fling: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + grassyterrain: ["9M"], + growth: ["9M"], + helpinghand: ["9M"], + hurricane: ["9M"], + hyperbeam: ["9M"], + leechseed: ["9M"], + lightscreen: ["9M"], + memento: ["9M"], + mistyterrain: ["9M"], + moonblast: ["9M"], + playrough: ["9M"], + poisonpowder: ["9M"], + protect: ["9M"], + psychic: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + seedbomb: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + stunspore: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + switcheroo: ["9M"], + tailwind: ["9M"], + taunt: ["9M"], + thief: ["9M"], + tickle: ["9M"], + trickroom: ["9M"], + uturn: ["9M"], + worryseed: ["9M"], + }, + }, + krookodile: { + learnset: { + aerialace: ["9M"], + aquatail: ["9M"], + assurance: ["9M"], + beatup: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + closecombat: ["9M"], + counter: ["9M"], + crunch: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + dragonclaw: ["9M"], + dragonpulse: ["9M"], + dragontail: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + firefang: ["9M"], + fissure: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focusenergy: ["9M"], + focuspunch: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gunkshot: ["9M"], + helpinghand: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + lashout: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + megakick: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + outrage: ["9M"], + payback: ["9M"], + powertrip: ["9M"], + protect: ["9M"], + rest: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandtomb: ["9M"], + sandstorm: ["9M"], + scaleshot: ["9M"], + scaryface: ["9M"], + scorchingsands: ["9M"], + shadowclaw: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + smackdown: ["9M"], + snarl: ["9M"], + snore: ["9M"], + spite: ["9M"], + stealthrock: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + superpower: ["9M"], + swagger: ["9M"], + taunt: ["9M"], + thief: ["9M"], + thrash: ["9M"], + throatchop: ["9M"], + thunderfang: ["9M"], + torment: ["9M"], + uproar: ["9M"], + }, + }, + cofagrigus: { + learnset: { + allyswitch: ["9M"], + attract: ["9M"], + bodypress: ["9M"], + calmmind: ["9M"], + confuseray: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + destinybond: ["9M"], + disable: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + faketears: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + guardsplit: ["9M"], + guardswap: ["9M"], + haze: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + imprison: ["9M"], + irondefense: ["9M"], + meanlook: ["9M"], + memento: ["9M"], + nastyplot: ["9M"], + nightshade: ["9M"], + payback: ["9M"], + phantomforce: ["9M"], + poltergeist: ["9M"], + powersplit: ["9M"], + powerswap: ["9M"], + protect: ["9M"], + psychic: ["9M"], + raindance: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + scaryface: ["9M"], + selfdestruct: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + shadowpunch: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + substitute: ["9M"], + thief: ["9M"], + toxicspikes: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + willowisp: ["9M"], + wonderroom: ["9M"], + zenheadbutt: ["9M"], + }, + }, + garbodor: { + learnset: { + acidspray: ["9M"], + amnesia: ["9M"], + ancientpower: ["9M"], + attract: ["9M"], + belch: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + clearsmog: ["9M"], + corrosivegas: ["9M"], + crosspoison: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + drainpunch: ["9M"], + endure: ["9M"], + explosion: ["9M"], + facade: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + gunkshot: ["9M"], + haze: ["9M"], + hyperbeam: ["9M"], + mudshot: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + poisonjab: ["9M"], + protect: ["9M"], + psychic: ["9M"], + raindance: ["9M"], + recycle: ["9M"], + rest: ["9M"], + rockblast: ["9M"], + round: ["9M"], + screech: ["9M"], + seedbomb: ["9M"], + selfdestruct: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + sludgewave: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + spikes: ["9M"], + stockpile: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swallow: ["9M"], + thief: ["9M"], + thunderbolt: ["9M"], + toxic: ["9M"], + toxicspikes: ["9M"], + venoshock: ["9M"], + }, + }, + zoroark: { + learnset: { + aerialace: ["9M"], + agility: ["9M"], + assurance: ["9M"], + bodyslam: ["9M"], + bounce: ["9M"], + brickbreak: ["9M"], + burningjealousy: ["9M"], + calmmind: ["9M"], + confuseray: ["9M"], + counter: ["9M"], + crunch: ["9M"], + darkpulse: ["9M"], + detect: ["9M"], + dig: ["9M"], + encore: ["9M"], + endure: ["9M"], + extrasensory: ["9M"], + facade: ["9M"], + faketears: ["9M"], + flamethrower: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + helpinghand: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + imprison: ["9M"], + knockoff: ["9M"], + lashout: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + megakick: ["9M"], + memento: ["9M"], + nastyplot: ["9M"], + nightdaze: ["9M"], + nightshade: ["9M"], + nightslash: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roar: ["9M"], + round: ["9M"], + scaryface: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + snarl: ["9M"], + snore: ["9M"], + spite: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + torment: ["9M"], + toxic: ["9M"], + trick: ["9M"], + uturn: ["9M"], + uproar: ["9M"], + }, + }, + zoroarkhisui: { + learnset: { + aerialace: ["9M"], + agility: ["9M"], + assurance: ["9M"], + bittermalice: ["9M"], + bodyslam: ["9M"], + bounce: ["9M"], + brickbreak: ["9M"], + burningjealousy: ["9M"], + calmmind: ["9M"], + comeuppance: ["9M"], + confuseray: ["9M"], + crunch: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + detect: ["9M"], + dig: ["9M"], + endure: ["9M"], + extrasensory: ["9M"], + facade: ["9M"], + faketears: ["9M"], + flamethrower: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + helpinghand: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icywind: ["9M"], + imprison: ["9M"], + knockoff: ["9M"], + lashout: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + megakick: ["9M"], + memento: ["9M"], + nastyplot: ["9M"], + nightshade: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + phantomforce: ["9M"], + poltergeist: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roar: ["9M"], + round: ["9M"], + scaryface: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + shadowsneak: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + snarl: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + spite: ["9M"], + substitute: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + torment: ["9M"], + trick: ["9M"], + uturn: ["9M"], + uproar: ["9M"], + willowisp: ["9M"], + }, + }, + reuniclus: { + learnset: { + acidarmor: ["9M"], + allyswitch: ["9M"], + attract: ["9M"], + bodyslam: ["9M"], + calmmind: ["9M"], + charm: ["9M"], + confuseray: ["9M"], + drainpunch: ["9M"], + encore: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + energyball: ["9M"], + expandingforce: ["9M"], + facade: ["9M"], + firepunch: ["9M"], + flashcannon: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + futuresight: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gravity: ["9M"], + guardswap: ["9M"], + gyroball: ["9M"], + hammerarm: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + icepunch: ["9M"], + imprison: ["9M"], + irondefense: ["9M"], + knockoff: ["9M"], + lightscreen: ["9M"], + nightshade: ["9M"], + painsplit: ["9M"], + powerswap: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psychicnoise: ["9M"], + psychicterrain: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + recover: ["9M"], + reflect: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + safeguard: ["9M"], + shadowball: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + steelroller: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + thunder: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + wonderroom: ["9M"], + zenheadbutt: ["9M"], + }, + }, + vanilluxe: { + learnset: { + acidarmor: ["9M"], + allyswitch: ["9M"], + attract: ["9M"], + auroraveil: ["9M"], + avalanche: ["9M"], + beatup: ["9M"], + blizzard: ["9M"], + chillingwater: ["9M"], + endure: ["9M"], + explosion: ["9M"], + facade: ["9M"], + flashcannon: ["9M"], + freezedry: ["9M"], + frostbreath: ["9M"], + gigaimpact: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icebeam: ["9M"], + iceshard: ["9M"], + icespinner: ["9M"], + iciclecrash: ["9M"], + iciclespear: ["9M"], + icywind: ["9M"], + imprison: ["9M"], + irondefense: ["9M"], + lightscreen: ["9M"], + magnetrise: ["9M"], + mirrorcoat: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + round: ["9M"], + selfdestruct: ["9M"], + sheercold: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + substitute: ["9M"], + taunt: ["9M"], + uproar: ["9M"], + weatherball: ["9M"], + }, + }, + emolga: { + learnset: { + acrobatics: ["9M"], + agility: ["9M"], + airslash: ["9M"], + attract: ["9M"], + batonpass: ["9M"], + charge: ["9M"], + chargebeam: ["9M"], + charm: ["9M"], + covet: ["9M"], + defog: ["9M"], + discharge: ["9M"], + doubleteam: ["9M"], + dualwingbeat: ["9M"], + eerieimpulse: ["9M"], + electroball: ["9M"], + electroweb: ["9M"], + encore: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + fling: ["9M"], + helpinghand: ["9M"], + irontail: ["9M"], + lightscreen: ["9M"], + nuzzle: ["9M"], + pounce: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + rest: ["9M"], + risingvoltage: ["9M"], + roost: ["9M"], + round: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + speedswap: ["9M"], + substitute: ["9M"], + taunt: ["9M"], + thunder: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + tickle: ["9M"], + uturn: ["9M"], + voltswitch: ["9M"], + wildcharge: ["9M"], + }, + }, + chandelure: { + learnset: { + acidarmor: ["9M"], + burningjealousy: ["9M"], + calmmind: ["9M"], + clearsmog: ["9M"], + confuseray: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + doubleteam: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firespin: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + gigaimpact: ["9M"], + haze: ["9M"], + heatwave: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + imprison: ["9M"], + inferno: ["9M"], + lashout: ["9M"], + memento: ["9M"], + minimize: ["9M"], + mysticalfire: ["9M"], + nightshade: ["9M"], + overheat: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + poltergeist: ["9M"], + powersplit: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + shadowball: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + spite: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + taunt: ["9M"], + temperflare: ["9M"], + thief: ["9M"], + trailblaze: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + willowisp: ["9M"], + }, + }, + beartic: { + learnset: { + aerialace: ["9M"], + aquajet: ["9M"], + assurance: ["9M"], + avalanche: ["9M"], + blizzard: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + charm: ["9M"], + chillingwater: ["9M"], + closecombat: ["9M"], + crunch: ["9M"], + curse: ["9M"], + dig: ["9M"], + dive: ["9M"], + doubleedge: ["9M"], + earthquake: ["9M"], + encore: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + flail: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + frostbreath: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + hardpress: ["9M"], + heavyslam: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icefang: ["9M"], + icepunch: ["9M"], + iciclecrash: ["9M"], + iciclespear: ["9M"], + icywind: ["9M"], + liquidation: ["9M"], + lowkick: ["9M"], + megakick: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + nightslash: ["9M"], + playrough: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scaryface: ["9M"], + shadowclaw: ["9M"], + sheercold: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + superpower: ["9M"], + surf: ["9M"], + swagger: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + thief: ["9M"], + thrash: ["9M"], + throatchop: ["9M"], + trailblaze: ["9M"], + waterpulse: ["9M"], + xscissor: ["9M"], + yawn: ["9M"], + }, + }, + stunfisk: { + learnset: { + attract: ["9M"], + bounce: ["9M"], + bulldoze: ["9M"], + charge: ["9M"], + curse: ["9M"], + dig: ["9M"], + discharge: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + eerieimpulse: ["9M"], + electricterrain: ["9M"], + electroweb: ["9M"], + endure: ["9M"], + facade: ["9M"], + fissure: ["9M"], + flail: ["9M"], + foulplay: ["9M"], + lashout: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + muddywater: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + protect: ["9M"], + raindance: ["9M"], + reflecttype: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scald: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + sludgewave: ["9M"], + snore: ["9M"], + spite: ["9M"], + stealthrock: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + surf: ["9M"], + thunder: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + uproar: ["9M"], + yawn: ["9M"], + }, + }, + stunfiskgalar: { + learnset: { + attract: ["9M"], + bind: ["9M"], + bounce: ["9M"], + bulldoze: ["9M"], + counter: ["9M"], + crunch: ["9M"], + curse: ["9M"], + dig: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + fissure: ["9M"], + flail: ["9M"], + flashcannon: ["9M"], + foulplay: ["9M"], + icefang: ["9M"], + irondefense: ["9M"], + lashout: ["9M"], + metalsound: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + muddywater: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + protect: ["9M"], + raindance: ["9M"], + reflecttype: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scald: ["9M"], + screech: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + sludgewave: ["9M"], + snaptrap: ["9M"], + snore: ["9M"], + spite: ["9M"], + stealthrock: ["9M"], + steelbeam: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + surf: ["9M"], + terrainpulse: ["9M"], + thunderwave: ["9M"], + uproar: ["9M"], + yawn: ["9M"], + }, + }, + golurk: { + learnset: { + bodypress: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulldoze: ["9M"], + chargebeam: ["9M"], + closecombat: ["9M"], + confuseray: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + drainpunch: ["9M"], + dynamicpunch: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + firepunch: ["9M"], + flashcannon: ["9M"], + fling: ["9M"], + fly: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gravity: ["9M"], + gyroball: ["9M"], + hammerarm: ["9M"], + hardpress: ["9M"], + headlongrush: ["9M"], + heatcrash: ["9M"], + heavyslam: ["9M"], + helpinghand: ["9M"], + hex: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + imprison: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + knockoff: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + megakick: ["9M"], + mudslap: ["9M"], + nightshade: ["9M"], + phantomforce: ["9M"], + poltergeist: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scorchingsands: ["9M"], + selfdestruct: ["9M"], + shadowball: ["9M"], + shadowpunch: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + stealthrock: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + thief: ["9M"], + thunderpunch: ["9M"], + thunderbolt: ["9M"], + trick: ["9M"], + zenheadbutt: ["9M"], + }, + }, + hydreigon: { + learnset: { + acrobatics: ["9M"], + assurance: ["9M"], + beatup: ["9M"], + belch: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + crunch: ["9M"], + darkpulse: ["9M"], + doublehit: ["9M"], + dracometeor: ["9M"], + dragoncheer: ["9M"], + dragondance: ["9M"], + dragonpulse: ["9M"], + dragonrush: ["9M"], + dragontail: ["9M"], + dualwingbeat: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firefang: ["9M"], + firespin: ["9M"], + flamethrower: ["9M"], + flashcannon: ["9M"], + fly: ["9M"], + focusblast: ["9M"], + focusenergy: ["9M"], + gigaimpact: ["9M"], + headsmash: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icefang: ["9M"], + irontail: ["9M"], + lashout: ["9M"], + nastyplot: ["9M"], + outrage: ["9M"], + payback: ["9M"], + protect: ["9M"], + psychup: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scaleshot: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + spite: ["9M"], + stealthrock: ["9M"], + steelwing: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + surf: ["9M"], + tailwind: ["9M"], + taunt: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + thunderfang: ["9M"], + thunderwave: ["9M"], + triattack: ["9M"], + uturn: ["9M"], + uproar: ["9M"], + zenheadbutt: ["9M"], + }, + }, + volcarona: { + learnset: { + acrobatics: ["9M"], + aircutter: ["9M"], + airslash: ["9M"], + amnesia: ["9M"], + bodyslam: ["9M"], + bugbite: ["9M"], + bugbuzz: ["9M"], + calmmind: ["9M"], + doubleedge: ["9M"], + dualwingbeat: ["9M"], + endure: ["9M"], + facade: ["9M"], + fierydance: ["9M"], + fireblast: ["9M"], + firespin: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + fly: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + heatwave: ["9M"], + hurricane: ["9M"], + hyperbeam: ["9M"], + leechlife: ["9M"], + lightscreen: ["9M"], + lunge: ["9M"], + morningsun: ["9M"], + mysticalfire: ["9M"], + overheat: ["9M"], + poisonjab: ["9M"], + pounce: ["9M"], + protect: ["9M"], + psychic: ["9M"], + quiverdance: ["9M"], + ragepowder: ["9M"], + raindance: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + screech: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + stringshot: ["9M"], + strugglebug: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + tailwind: ["9M"], + thrash: ["9M"], + trailblaze: ["9M"], + uturn: ["9M"], + whirlwind: ["9M"], + wildcharge: ["9M"], + willowisp: ["9M"], + zenheadbutt: ["9M"], + }, + }, + chesnaught: { + learnset: { + aerialace: ["9M"], + bellydrum: ["9M"], + bite: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + bulletseed: ["9M"], + closecombat: ["9M"], + coaching: ["9M"], + crunch: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + dragonclaw: ["9M"], + drainpunch: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + feint: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + frenzyplant: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + grassyterrain: ["9M"], + growth: ["9M"], + gyroball: ["9M"], + hammerarm: ["9M"], + helpinghand: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + leafstorm: ["9M"], + leechseed: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + pinmissile: ["9M"], + poisonjab: ["9M"], + protect: ["9M"], + quickguard: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scaryface: ["9M"], + seedbomb: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + spikes: ["9M"], + spikyshield: ["9M"], + steelroller: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superfang: ["9M"], + superpower: ["9M"], + swordsdance: ["9M"], + synthesis: ["9M"], + taunt: ["9M"], + thunderpunch: ["9M"], + trailblaze: ["9M"], + wideguard: ["9M"], + woodhammer: ["9M"], + zenheadbutt: ["9M"], + }, + }, + delphox: { + learnset: { + agility: ["9M"], + blastburn: ["9M"], + burningjealousy: ["9M"], + calmmind: ["9M"], + charm: ["9M"], + confuseray: ["9M"], + copycat: ["9M"], + dazzlinggleam: ["9M"], + doubleteam: ["9M"], + encore: ["9M"], + endure: ["9M"], + expandingforce: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firepunch: ["9M"], + firespin: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + focusblast: ["9M"], + foulplay: ["9M"], + futuresight: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + hex: ["9M"], + howl: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + hypnosis: ["9M"], + imprison: ["9M"], + irontail: ["9M"], + lightscreen: ["9M"], + lowkick: ["9M"], + magicroom: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + mysticalfire: ["9M"], + nastyplot: ["9M"], + nightshade: ["9M"], + overheat: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psychicnoise: ["9M"], + psychicterrain: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + roleplay: ["9M"], + round: ["9M"], + safeguard: ["9M"], + scorchingsands: ["9M"], + shadowball: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + switcheroo: ["9M"], + thief: ["9M"], + thunderpunch: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + willowisp: ["9M"], + wish: ["9M"], + wonderroom: ["9M"], + zenheadbutt: ["9M"], + }, + }, + greninja: { + learnset: { + acrobatics: ["9M"], + aerialace: ["9M"], + blizzard: ["9M"], + bounce: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + chillingwater: ["9M"], + counter: ["9M"], + darkpulse: ["9M"], + dig: ["9M"], + dive: ["9M"], + doubleteam: ["9M"], + endure: ["9M"], + extrasensory: ["9M"], + facade: ["9M"], + fling: ["9M"], + flipturn: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gunkshot: ["9M"], + haze: ["9M"], + helpinghand: ["9M"], + hydrocannon: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + liquidation: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + nightslash: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + roleplay: ["9M"], + round: ["9M"], + shadowsneak: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + sludgewave: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + spikes: ["9M"], + substitute: ["9M"], + surf: ["9M"], + switcheroo: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + thief: ["9M"], + toxicspikes: ["9M"], + trailblaze: ["9M"], + uturn: ["9M"], + upperhand: ["9M"], + waterpulse: ["9M"], + watershuriken: ["9M"], + waterfall: ["9M"], + weatherball: ["9M"], + }, + }, + diggersby: { + learnset: { + agility: ["9M"], + attract: ["9M"], + bodyslam: ["9M"], + bounce: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + dig: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + firepunch: ["9M"], + fissure: ["9M"], + flail: ["9M"], + fling: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gunkshot: ["9M"], + hammerarm: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + icepunch: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + lowkick: ["9M"], + megakick: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + payback: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandtomb: ["9M"], + sandstorm: ["9M"], + scorchingsands: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + snore: ["9M"], + spikes: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + superfang: ["9M"], + superpower: ["9M"], + surf: ["9M"], + swordsdance: ["9M"], + thief: ["9M"], + thunderpunch: ["9M"], + trailblaze: ["9M"], + uturn: ["9M"], + uproar: ["9M"], + wildcharge: ["9M"], + }, + }, + talonflame: { + learnset: { + acrobatics: ["9M"], + aerialace: ["9M"], + agility: ["9M"], + aircutter: ["9M"], + airslash: ["9M"], + blazekick: ["9M"], + bravebird: ["9M"], + bulkup: ["9M"], + defog: ["9M"], + doubleedge: ["9M"], + dualwingbeat: ["9M"], + endure: ["9M"], + facade: ["9M"], + featherdance: ["9M"], + feint: ["9M"], + fireblast: ["9M"], + firespin: ["9M"], + flail: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + fly: ["9M"], + gigaimpact: ["9M"], + heatwave: ["9M"], + hurricane: ["9M"], + hyperbeam: ["9M"], + overheat: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + quickguard: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roost: ["9M"], + round: ["9M"], + skyattack: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + steelwing: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + tailwind: ["9M"], + taunt: ["9M"], + temperflare: ["9M"], + thief: ["9M"], + uturn: ["9M"], + upperhand: ["9M"], + whirlwind: ["9M"], + willowisp: ["9M"], + }, + }, + vivillon: { + learnset: { + acrobatics: ["9M"], + aircutter: ["9M"], + airslash: ["9M"], + bugbite: ["9M"], + bugbuzz: ["9M"], + calmmind: ["9M"], + confuseray: ["9M"], + drainingkiss: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + hurricane: ["9M"], + hyperbeam: ["9M"], + irondefense: ["9M"], + lightscreen: ["9M"], + poisonpowder: ["9M"], + pollenpuff: ["9M"], + pounce: ["9M"], + protect: ["9M"], + psychic: ["9M"], + quiverdance: ["9M"], + ragepowder: ["9M"], + raindance: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + skittersmack: ["9M"], + sleeppowder: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + stringshot: ["9M"], + strugglebug: ["9M"], + stunspore: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + tailwind: ["9M"], + thief: ["9M"], + uturn: ["9M"], + weatherball: ["9M"], + whirlwind: ["9M"], + }, + }, + vivillonfancy: {}, + vivillonpokeball: {}, + floetteeternal: { + learnset: { + alluringvoice: ["9M"], + batonpass: ["9M"], + calmmind: ["9M"], + charm: ["9M"], + chillingwater: ["9M"], + copycat: ["9M"], + dazzlinggleam: ["9M"], + drainingkiss: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + gigadrain: ["9M"], + grassknot: ["9M"], + grassyterrain: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + lightofruin: ["9M"], + lightscreen: ["9M"], + mistyterrain: ["9M"], + moonblast: ["9M"], + petalblizzard: ["9M"], + petaldance: ["9M"], + pollenpuff: ["9M"], + protect: ["9M"], + psychic: ["9M"], + raindance: ["9M"], + rest: ["9M"], + safeguard: ["9M"], + seedbomb: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + solarbeam: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + synthesis: ["9M"], + tearfullook: ["9M"], + trailblaze: ["9M"], + trick: ["9M"], + wish: ["9M"], + }, + }, + florges: { + learnset: { + alluringvoice: ["9M"], + batonpass: ["9M"], + calmmind: ["9M"], + charm: ["9M"], + chillingwater: ["9M"], + copycat: ["9M"], + dazzlinggleam: ["9M"], + drainingkiss: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + grassyterrain: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + lightscreen: ["9M"], + mistyexplosion: ["9M"], + mistyterrain: ["9M"], + moonblast: ["9M"], + petalblizzard: ["9M"], + petaldance: ["9M"], + pollenpuff: ["9M"], + protect: ["9M"], + psychic: ["9M"], + psychicnoise: ["9M"], + raindance: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + seedbomb: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + synthesis: ["9M"], + tearfullook: ["9M"], + trailblaze: ["9M"], + trick: ["9M"], + wish: ["9M"], + }, + }, + pangoro: { + learnset: { + attract: ["9M"], + beatup: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + bulletpunch: ["9M"], + circlethrow: ["9M"], + closecombat: ["9M"], + coaching: ["9M"], + comeuppance: ["9M"], + crunch: ["9M"], + darkpulse: ["9M"], + darkestlariat: ["9M"], + detect: ["9M"], + dig: ["9M"], + dragonclaw: ["9M"], + drainpunch: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + entrainment: ["9M"], + facade: ["9M"], + firepunch: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focusenergy: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gunkshot: ["9M"], + hammerarm: ["9M"], + headlongrush: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icepunch: ["9M"], + ironhead: ["9M"], + knockoff: ["9M"], + lashout: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + megakick: ["9M"], + nightslash: ["9M"], + outrage: ["9M"], + partingshot: ["9M"], + payback: ["9M"], + poisonjab: ["9M"], + powertrip: ["9M"], + protect: ["9M"], + quash: ["9M"], + quickguard: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scaryface: ["9M"], + seismictoss: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + snarl: ["9M"], + snore: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + stormthrow: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + surf: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + thunderpunch: ["9M"], + uproar: ["9M"], + xscissor: ["9M"], + zenheadbutt: ["9M"], + }, + }, + furfrou: { + learnset: { + attract: ["9M"], + babydolleyes: ["9M"], + bite: ["9M"], + charm: ["9M"], + cottonguard: ["9M"], + crunch: ["9M"], + darkpulse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + firefang: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + helpinghand: ["9M"], + hypervoice: ["9M"], + icefang: ["9M"], + irontail: ["9M"], + lastresort: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roar: ["9M"], + round: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + surf: ["9M"], + thunderfang: ["9M"], + thunderwave: ["9M"], + trailblaze: ["9M"], + uturn: ["9M"], + uproar: ["9M"], + wildcharge: ["9M"], + zenheadbutt: ["9M"], + }, + }, + meowstic: { + learnset: { + alluringvoice: ["9M"], + batonpass: ["9M"], + calmmind: ["9M"], + chargebeam: ["9M"], + charm: ["9M"], + covet: ["9M"], + darkpulse: ["9M"], + dig: ["9M"], + endure: ["9M"], + energyball: ["9M"], + expandingforce: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + faketears: ["9M"], + gigaimpact: ["9M"], + gravity: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + imprison: ["9M"], + irontail: ["9M"], + lightscreen: ["9M"], + magicroom: ["9M"], + meanlook: ["9M"], + mistyterrain: ["9M"], + nastyplot: ["9M"], + payback: ["9M"], + playrough: ["9M"], + protect: ["9M"], + psychic: ["9M"], + psychicnoise: ["9M"], + psychicterrain: ["9M"], + psychup: ["9M"], + psyshock: ["9M"], + quickguard: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + roleplay: ["9M"], + round: ["9M"], + safeguard: ["9M"], + shadowball: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + tailslap: ["9M"], + thunderbolt: ["9M"], + thunderwave: ["9M"], + tickle: ["9M"], + trailblaze: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + wish: ["9M"], + wonderroom: ["9M"], + yawn: ["9M"], + zenheadbutt: ["9M"], + }, + }, + meowsticf: { + learnset: { + alluringvoice: ["9M"], + batonpass: ["9M"], + calmmind: ["9M"], + chargebeam: ["9M"], + charm: ["9M"], + covet: ["9M"], + darkpulse: ["9M"], + dig: ["9M"], + endure: ["9M"], + energyball: ["9M"], + expandingforce: ["9M"], + extrasensory: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + faketears: ["9M"], + futuresight: ["9M"], + gigaimpact: ["9M"], + gravity: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + irontail: ["9M"], + lightscreen: ["9M"], + magicroom: ["9M"], + nastyplot: ["9M"], + payback: ["9M"], + playrough: ["9M"], + protect: ["9M"], + psychic: ["9M"], + psychicnoise: ["9M"], + psychicterrain: ["9M"], + psychup: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + roleplay: ["9M"], + round: ["9M"], + safeguard: ["9M"], + shadowball: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + tailslap: ["9M"], + thunderbolt: ["9M"], + thunderwave: ["9M"], + tickle: ["9M"], + trailblaze: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + wonderroom: ["9M"], + yawn: ["9M"], + zenheadbutt: ["9M"], + }, + }, + aegislash: { + learnset: { + aerialace: ["9M"], + airslash: ["9M"], + attract: ["9M"], + block: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + closecombat: ["9M"], + destinybond: ["9M"], + doublehit: ["9M"], + endure: ["9M"], + facade: ["9M"], + flashcannon: ["9M"], + gigaimpact: ["9M"], + gyroball: ["9M"], + headsmash: ["9M"], + hyperbeam: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + kingsshield: ["9M"], + metalsound: ["9M"], + nightslash: ["9M"], + poltergeist: ["9M"], + powertrick: ["9M"], + protect: ["9M"], + psychocut: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockslide: ["9M"], + round: ["9M"], + sacredsword: ["9M"], + screech: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + shadowsneak: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarblade: ["9M"], + steelbeam: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + wideguard: ["9M"], + zenheadbutt: ["9M"], + }, + }, + aromatisse: { + learnset: { + afteryou: ["9M"], + alluringvoice: ["9M"], + allyswitch: ["9M"], + aromaticmist: ["9M"], + attract: ["9M"], + calmmind: ["9M"], + charm: ["9M"], + dazzlinggleam: ["9M"], + disable: ["9M"], + drainpunch: ["9M"], + drainingkiss: ["9M"], + encore: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + faketears: ["9M"], + flail: ["9M"], + flashcannon: ["9M"], + gigaimpact: ["9M"], + gyroball: ["9M"], + healpulse: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + hypnosis: ["9M"], + lightscreen: ["9M"], + mistyexplosion: ["9M"], + mistyterrain: ["9M"], + moonblast: ["9M"], + nastyplot: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + round: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + sweetkiss: ["9M"], + sweetscent: ["9M"], + thunder: ["9M"], + thunderbolt: ["9M"], + trickroom: ["9M"], + wish: ["9M"], + }, + }, + slurpuff: { + learnset: { + afteryou: ["9M"], + amnesia: ["9M"], + attract: ["9M"], + calmmind: ["9M"], + charm: ["9M"], + copycat: ["9M"], + cottonguard: ["9M"], + cottonspore: ["9M"], + dazzlinggleam: ["9M"], + drainpunch: ["9M"], + drainingkiss: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + faketears: ["9M"], + flamethrower: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + lightscreen: ["9M"], + mistyexplosion: ["9M"], + playrough: ["9M"], + protect: ["9M"], + psychic: ["9M"], + raindance: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + stickyweb: ["9M"], + stringshot: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + surf: ["9M"], + sweetscent: ["9M"], + thief: ["9M"], + thunder: ["9M"], + thunderbolt: ["9M"], + wish: ["9M"], + yawn: ["9M"], + }, + }, + clawitzer: { + learnset: { + aquajet: ["9M"], + aquatail: ["9M"], + aurasphere: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + bounce: ["9M"], + chillingwater: ["9M"], + crabhammer: ["9M"], + darkpulse: ["9M"], + dive: ["9M"], + dragonpulse: ["9M"], + endure: ["9M"], + entrainment: ["9M"], + facade: ["9M"], + flail: ["9M"], + flashcannon: ["9M"], + flipturn: ["9M"], + focusblast: ["9M"], + gigaimpact: ["9M"], + healpulse: ["9M"], + helpinghand: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icywind: ["9M"], + liquidation: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + muddywater: ["9M"], + pounce: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + round: ["9M"], + scaryface: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + sludgewave: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + substitute: ["9M"], + surf: ["9M"], + swordsdance: ["9M"], + terrainpulse: ["9M"], + thief: ["9M"], + uturn: ["9M"], + venoshock: ["9M"], + waterfall: ["9M"], + waterpulse: ["9M"], + weatherball: ["9M"], + }, + }, + heliolisk: { + learnset: { + agility: ["9M"], + allyswitch: ["9M"], + attract: ["9M"], + breakingswipe: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + charge: ["9M"], + chargebeam: ["9M"], + darkpulse: ["9M"], + dig: ["9M"], + discharge: ["9M"], + dragonpulse: ["9M"], + dragonrush: ["9M"], + dragontail: ["9M"], + eerieimpulse: ["9M"], + electricterrain: ["9M"], + electrify: ["9M"], + electroball: ["9M"], + electroweb: ["9M"], + endure: ["9M"], + facade: ["9M"], + firepunch: ["9M"], + focusblast: ["9M"], + gigaimpact: ["9M"], + glare: ["9M"], + grassknot: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + irontail: ["9M"], + lightscreen: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + megakick: ["9M"], + morningsun: ["9M"], + mudslap: ["9M"], + paraboliccharge: ["9M"], + pounce: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + rest: ["9M"], + risingvoltage: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scaleshot: ["9M"], + shedtail: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + surf: ["9M"], + thunder: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + trailblaze: ["9M"], + uturn: ["9M"], + voltswitch: ["9M"], + weatherball: ["9M"], + wildcharge: ["9M"], + }, + }, + tyrantrum: { + learnset: { + ancientpower: ["9M"], + assurance: ["9M"], + attract: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + charm: ["9M"], + closecombat: ["9M"], + crunch: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + dig: ["9M"], + dracometeor: ["9M"], + dragoncheer: ["9M"], + dragonclaw: ["9M"], + dragondance: ["9M"], + dragonpulse: ["9M"], + dragontail: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + firefang: ["9M"], + gigaimpact: ["9M"], + headsmash: ["9M"], + highhorsepower: ["9M"], + horndrill: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icefang: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + lashout: ["9M"], + meteorbeam: ["9M"], + outrage: ["9M"], + playrough: ["9M"], + poisonfang: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + rest: ["9M"], + roar: ["9M"], + rockblast: ["9M"], + rockpolish: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scaleshot: ["9M"], + scaryface: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + stealthrock: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + thrash: ["9M"], + thunderfang: ["9M"], + zenheadbutt: ["9M"], + }, + }, + aurorus: { + learnset: { + ancientpower: ["9M"], + attract: ["9M"], + auroraveil: ["9M"], + avalanche: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + calmmind: ["9M"], + chillingwater: ["9M"], + darkpulse: ["9M"], + discharge: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + encore: ["9M"], + endure: ["9M"], + facade: ["9M"], + flashcannon: ["9M"], + freezedry: ["9M"], + gigaimpact: ["9M"], + haze: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icebeam: ["9M"], + icespinner: ["9M"], + iciclespear: ["9M"], + icywind: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + lightscreen: ["9M"], + meteorbeam: ["9M"], + mirrorcoat: ["9M"], + mudshot: ["9M"], + outrage: ["9M"], + protect: ["9M"], + psychic: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + safeguard: ["9M"], + sandstorm: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + stealthrock: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + thunder: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + weatherball: ["9M"], + zenheadbutt: ["9M"], + }, + }, + sylveon: { + learnset: { + alluringvoice: ["9M"], + babydolleyes: ["9M"], + batonpass: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + calmmind: ["9M"], + charm: ["9M"], + copycat: ["9M"], + covet: ["9M"], + curse: ["9M"], + dazzlinggleam: ["9M"], + detect: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + drainingkiss: ["9M"], + endure: ["9M"], + facade: ["9M"], + faketears: ["9M"], + flail: ["9M"], + focusenergy: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + lastresort: ["9M"], + lightscreen: ["9M"], + mistyexplosion: ["9M"], + mistyterrain: ["9M"], + moonblast: ["9M"], + mudslap: ["9M"], + mysticalfire: ["9M"], + playrough: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psyshock: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + roar: ["9M"], + round: ["9M"], + safeguard: ["9M"], + shadowball: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + tickle: ["9M"], + trailblaze: ["9M"], + weatherball: ["9M"], + wish: ["9M"], + yawn: ["9M"], + }, + }, + hawlucha: { + learnset: { + acrobatics: ["9M"], + aerialace: ["9M"], + agility: ["9M"], + airslash: ["9M"], + assurance: ["9M"], + batonpass: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + bounce: ["9M"], + bravebird: ["9M"], + brickbreak: ["9M"], + bulkup: ["9M"], + closecombat: ["9M"], + coaching: ["9M"], + crosschop: ["9M"], + defog: ["9M"], + detect: ["9M"], + dig: ["9M"], + drainpunch: ["9M"], + dualwingbeat: ["9M"], + encore: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + entrainment: ["9M"], + facade: ["9M"], + featherdance: ["9M"], + feint: ["9M"], + firepunch: ["9M"], + fling: ["9M"], + fly: ["9M"], + flyingpress: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + helpinghand: ["9M"], + highjumpkick: ["9M"], + hyperbeam: ["9M"], + ironhead: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + lunge: ["9M"], + meanlook: ["9M"], + megakick: ["9M"], + payback: ["9M"], + poisonjab: ["9M"], + protect: ["9M"], + quickguard: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + roost: ["9M"], + round: ["9M"], + skyattack: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + steelwing: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + thunderpunch: ["9M"], + trailblaze: ["9M"], + uturn: ["9M"], + upperhand: ["9M"], + uproar: ["9M"], + xscissor: ["9M"], + zenheadbutt: ["9M"], + }, + }, + dedenne: { + learnset: { + agility: ["9M"], + charge: ["9M"], + chargebeam: ["9M"], + charm: ["9M"], + covet: ["9M"], + dazzlinggleam: ["9M"], + dig: ["9M"], + discharge: ["9M"], + drainingkiss: ["9M"], + eerieimpulse: ["9M"], + electricterrain: ["9M"], + electroball: ["9M"], + electroweb: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + entrainment: ["9M"], + facade: ["9M"], + fling: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + irontail: ["9M"], + lightscreen: ["9M"], + magnetrise: ["9M"], + mistyterrain: ["9M"], + nuzzle: ["9M"], + paraboliccharge: ["9M"], + playrough: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + risingvoltage: ["9M"], + round: ["9M"], + seedbomb: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superfang: ["9M"], + tearfullook: ["9M"], + thief: ["9M"], + thunder: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + trailblaze: ["9M"], + uturn: ["9M"], + voltswitch: ["9M"], + wildcharge: ["9M"], + }, + }, + goodra: { + learnset: { + acidarmor: ["9M"], + acidspray: ["9M"], + aquatail: ["9M"], + assurance: ["9M"], + blizzard: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + charm: ["9M"], + chillingwater: ["9M"], + counter: ["9M"], + curse: ["9M"], + dracometeor: ["9M"], + dragoncheer: ["9M"], + dragonclaw: ["9M"], + dragonpulse: ["9M"], + dragontail: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + feint: ["9M"], + fireblast: ["9M"], + firepunch: ["9M"], + flail: ["9M"], + flamethrower: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + lifedew: ["9M"], + megakick: ["9M"], + mudshot: ["9M"], + muddywater: ["9M"], + outrage: ["9M"], + powerwhip: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + round: ["9M"], + scald: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + sludgewave: ["9M"], + snore: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + surf: ["9M"], + tearfullook: ["9M"], + thunder: ["9M"], + thunderpunch: ["9M"], + thunderbolt: ["9M"], + toxic: ["9M"], + waterpulse: ["9M"], + weatherball: ["9M"], + }, + }, + goodrahisui: { + learnset: { + acidspray: ["9M"], + ancientpower: ["9M"], + blizzard: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + bulldoze: ["9M"], + charm: ["9M"], + chillingwater: ["9M"], + counter: ["9M"], + curse: ["9M"], + dracometeor: ["9M"], + dragoncheer: ["9M"], + dragonclaw: ["9M"], + dragonpulse: ["9M"], + dragontail: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + feint: ["9M"], + fireblast: ["9M"], + firepunch: ["9M"], + flail: ["9M"], + flamethrower: ["9M"], + flashcannon: ["9M"], + gigaimpact: ["9M"], + gyroball: ["9M"], + heavyslam: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icespinner: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + lashout: ["9M"], + lifedew: ["9M"], + mudshot: ["9M"], + muddywater: ["9M"], + outrage: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + shelter: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + sludgewave: ["9M"], + steelbeam: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + surf: ["9M"], + tearfullook: ["9M"], + thunder: ["9M"], + thunderpunch: ["9M"], + thunderbolt: ["9M"], + waterpulse: ["9M"], + weatherball: ["9M"], + }, + }, + klefki: { + learnset: { + calmmind: ["9M"], + dazzlinggleam: ["9M"], + drainingkiss: ["9M"], + endure: ["9M"], + facade: ["9M"], + fairylock: ["9M"], + flashcannon: ["9M"], + foulplay: ["9M"], + futuresight: ["9M"], + gigaimpact: ["9M"], + hyperbeam: ["9M"], + imprison: ["9M"], + irondefense: ["9M"], + lastresort: ["9M"], + lightscreen: ["9M"], + magicroom: ["9M"], + magnetrise: ["9M"], + metalsound: ["9M"], + mistyterrain: ["9M"], + playrough: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + recycle: ["9M"], + reflect: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + sandstorm: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + spikes: ["9M"], + steelbeam: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + switcheroo: ["9M"], + thief: ["9M"], + thunderwave: ["9M"], + torment: ["9M"], + trickroom: ["9M"], + }, + }, + trevenant: { + learnset: { + allyswitch: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + burningjealousy: ["9M"], + calmmind: ["9M"], + confuseray: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + destinybond: ["9M"], + dig: ["9M"], + disable: ["9M"], + drainpunch: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + focusblast: ["9M"], + forestscurse: ["9M"], + foulplay: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + grassyterrain: ["9M"], + growth: ["9M"], + haze: ["9M"], + hex: ["9M"], + hornleech: ["9M"], + hyperbeam: ["9M"], + imprison: ["9M"], + ingrain: ["9M"], + knockoff: ["9M"], + lashout: ["9M"], + leafstorm: ["9M"], + leechseed: ["9M"], + nightshade: ["9M"], + painsplit: ["9M"], + phantomforce: ["9M"], + poisonjab: ["9M"], + poltergeist: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psychicnoise: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + round: ["9M"], + safeguard: ["9M"], + scaryface: ["9M"], + seedbomb: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + shadowpunch: ["9M"], + skillswap: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + spite: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + swagger: ["9M"], + thief: ["9M"], + toxic: ["9M"], + trailblaze: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + willowisp: ["9M"], + woodhammer: ["9M"], + xscissor: ["9M"], + }, + }, + gourgeist: { + learnset: { + allyswitch: ["9M"], + attract: ["9M"], + brutalswing: ["9M"], + bulletseed: ["9M"], + confuseray: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + destinybond: ["9M"], + disable: ["9M"], + endure: ["9M"], + energyball: ["9M"], + explosion: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + flamethrower: ["9M"], + focusblast: ["9M"], + foulplay: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + gyroball: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + hypnosis: ["9M"], + imprison: ["9M"], + leechseed: ["9M"], + lightscreen: ["9M"], + moonblast: ["9M"], + mysticalfire: ["9M"], + nastyplot: ["9M"], + painsplit: ["9M"], + phantomforce: ["9M"], + poltergeist: ["9M"], + powerwhip: ["9M"], + protect: ["9M"], + psychic: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + round: ["9M"], + safeguard: ["9M"], + scaryface: ["9M"], + seedbomb: ["9M"], + selfdestruct: ["9M"], + shadowball: ["9M"], + shadowsneak: ["9M"], + skillswap: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + thief: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + trickortreat: ["9M"], + willowisp: ["9M"], + worryseed: ["9M"], + }, + }, + gourgeistsuper: {}, + avalugg: { + learnset: { + auroraveil: ["9M"], + avalanche: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + chillingwater: ["9M"], + crunch: ["9M"], + curse: ["9M"], + doubleedge: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + flashcannon: ["9M"], + frostbreath: ["9M"], + gigaimpact: ["9M"], + gyroball: ["9M"], + heavyslam: ["9M"], + highhorsepower: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icefang: ["9M"], + icespinner: ["9M"], + iciclecrash: ["9M"], + iciclespear: ["9M"], + icywind: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + mirrorcoat: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rapidspin: ["9M"], + recover: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scaryface: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + superpower: ["9M"], + surf: ["9M"], + wideguard: ["9M"], + }, + }, + avalugghisui: { + learnset: { + ancientpower: ["9M"], + auroraveil: ["9M"], + avalanche: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + chillingwater: ["9M"], + crunch: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + gigaimpact: ["9M"], + gyroball: ["9M"], + hardpress: ["9M"], + heavyslam: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icefang: ["9M"], + icespinner: ["9M"], + iciclespear: ["9M"], + icywind: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + meteorbeam: ["9M"], + mirrorcoat: ["9M"], + mountaingale: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rapidspin: ["9M"], + recover: ["9M"], + rest: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + sleeptalk: ["9M"], + snowscape: ["9M"], + stealthrock: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + wideguard: ["9M"], + }, + }, + noivern: { + learnset: { + acrobatics: ["9M"], + aerialace: ["9M"], + agility: ["9M"], + aircutter: ["9M"], + airslash: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + boomburst: ["9M"], + breakingswipe: ["9M"], + brickbreak: ["9M"], + darkpulse: ["9M"], + defog: ["9M"], + doubleteam: ["9M"], + doubleedge: ["9M"], + dracometeor: ["9M"], + dragoncheer: ["9M"], + dragonclaw: ["9M"], + dragondance: ["9M"], + dragonpulse: ["9M"], + dragonrush: ["9M"], + dragontail: ["9M"], + dualwingbeat: ["9M"], + endure: ["9M"], + facade: ["9M"], + flamethrower: ["9M"], + fly: ["9M"], + focusblast: ["9M"], + gigaimpact: ["9M"], + heatwave: ["9M"], + hurricane: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + irontail: ["9M"], + leechlife: ["9M"], + moonlight: ["9M"], + outrage: ["9M"], + protect: ["9M"], + psychic: ["9M"], + psychicnoise: ["9M"], + rest: ["9M"], + roost: ["9M"], + round: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + skyattack: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + steelwing: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superfang: ["9M"], + switcheroo: ["9M"], + tailwind: ["9M"], + taunt: ["9M"], + thief: ["9M"], + uturn: ["9M"], + uproar: ["9M"], + waterpulse: ["9M"], + whirlwind: ["9M"], + wildcharge: ["9M"], + xscissor: ["9M"], + }, + }, + decidueye: { + learnset: { + acrobatics: ["9M"], + aerialace: ["9M"], + aircutter: ["9M"], + airslash: ["9M"], + batonpass: ["9M"], + bravebird: ["9M"], + bulletseed: ["9M"], + confuseray: ["9M"], + curse: ["9M"], + defog: ["9M"], + doubleteam: ["9M"], + dualwingbeat: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + featherdance: ["9M"], + frenzyplant: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + grassyterrain: ["9M"], + haze: ["9M"], + helpinghand: ["9M"], + hex: ["9M"], + hurricane: ["9M"], + hyperbeam: ["9M"], + imprison: ["9M"], + knockoff: ["9M"], + leafblade: ["9M"], + leafstorm: ["9M"], + lightscreen: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + nastyplot: ["9M"], + nightshade: ["9M"], + phantomforce: ["9M"], + pluck: ["9M"], + poltergeist: ["9M"], + protect: ["9M"], + psychocut: ["9M"], + raindance: ["9M"], + rest: ["9M"], + roost: ["9M"], + round: ["9M"], + seedbomb: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + shadowsneak: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + solarblade: ["9M"], + spiritshackle: ["9M"], + spite: ["9M"], + steelwing: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + synthesis: ["9M"], + tailwind: ["9M"], + trailblaze: ["9M"], + uturn: ["9M"], + }, + }, + decidueyehisui: { + learnset: { + aerialace: ["9M"], + aircutter: ["9M"], + airslash: ["9M"], + aurasphere: ["9M"], + batonpass: ["9M"], + bravebird: ["9M"], + brickbreak: ["9M"], + bulkup: ["9M"], + bulletseed: ["9M"], + closecombat: ["9M"], + coaching: ["9M"], + confuseray: ["9M"], + defog: ["9M"], + doubleteam: ["9M"], + dualwingbeat: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + featherdance: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + frenzyplant: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + grassyterrain: ["9M"], + haze: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + knockoff: ["9M"], + leafblade: ["9M"], + leafstorm: ["9M"], + lightscreen: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + nastyplot: ["9M"], + nightshade: ["9M"], + pluck: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rocktomb: ["9M"], + roost: ["9M"], + round: ["9M"], + scaryface: ["9M"], + seedbomb: ["9M"], + shadowclaw: ["9M"], + shadowsneak: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + steelwing: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + synthesis: ["9M"], + tailwind: ["9M"], + taunt: ["9M"], + trailblaze: ["9M"], + triplearrows: ["9M"], + uturn: ["9M"], + upperhand: ["9M"], + }, + }, + incineroar: { + learnset: { + acrobatics: ["9M"], + aerialace: ["9M"], + assurance: ["9M"], + attract: ["9M"], + batonpass: ["9M"], + bite: ["9M"], + blastburn: ["9M"], + blazekick: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + burningjealousy: ["9M"], + closecombat: ["9M"], + crosschop: ["9M"], + crunch: ["9M"], + darkpulse: ["9M"], + darkestlariat: ["9M"], + doubleedge: ["9M"], + drainpunch: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + fireblast: ["9M"], + firefang: ["9M"], + firepunch: ["9M"], + firespin: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + heatcrash: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + ironhead: ["9M"], + lashout: ["9M"], + leechlife: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + megakick: ["9M"], + nastyplot: ["9M"], + outrage: ["9M"], + overheat: ["9M"], + partingshot: ["9M"], + powertrip: ["9M"], + protect: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roar: ["9M"], + round: ["9M"], + scaryface: ["9M"], + scorchingsands: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + swagger: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + temperflare: ["9M"], + thief: ["9M"], + thrash: ["9M"], + throatchop: ["9M"], + thunderpunch: ["9M"], + trailblaze: ["9M"], + willowisp: ["9M"], + }, + }, + primarina: { + learnset: { + acrobatics: ["9M"], + alluringvoice: ["9M"], + amnesia: ["9M"], + aquajet: ["9M"], + aquaring: ["9M"], + attract: ["9M"], + babydolleyes: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + calmmind: ["9M"], + charm: ["9M"], + chillingwater: ["9M"], + dazzlinggleam: ["9M"], + dive: ["9M"], + drainingkiss: ["9M"], + encore: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + flipturn: ["9M"], + gigaimpact: ["9M"], + haze: ["9M"], + helpinghand: ["9M"], + hydrocannon: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icebeam: ["9M"], + icespinner: ["9M"], + icywind: ["9M"], + irontail: ["9M"], + lifedew: ["9M"], + lightscreen: ["9M"], + liquidation: ["9M"], + mistyexplosion: ["9M"], + mistyterrain: ["9M"], + moonblast: ["9M"], + perishsong: ["9M"], + playrough: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psychicnoise: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + round: ["9M"], + shadowball: ["9M"], + sing: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + sparklingaria: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + surf: ["9M"], + tripleaxel: ["9M"], + uproar: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + weatherball: ["9M"], + whirlpool: ["9M"], + wonderroom: ["9M"], + }, + }, + toucannon: { + learnset: { + acrobatics: ["9M"], + aerialace: ["9M"], + aircutter: ["9M"], + airslash: ["9M"], + attract: ["9M"], + beakblast: ["9M"], + boomburst: ["9M"], + bravebird: ["9M"], + brickbreak: ["9M"], + bulletseed: ["9M"], + drillpeck: ["9M"], + dualwingbeat: ["9M"], + encore: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + featherdance: ["9M"], + flamecharge: ["9M"], + flashcannon: ["9M"], + fly: ["9M"], + gigaimpact: ["9M"], + gunkshot: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + hurricane: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + knockoff: ["9M"], + overheat: ["9M"], + pluck: ["9M"], + protect: ["9M"], + psychup: ["9M"], + rest: ["9M"], + rockblast: ["9M"], + roost: ["9M"], + round: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + seedbomb: ["9M"], + skyattack: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + steelwing: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + tailwind: ["9M"], + temperflare: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + uturn: ["9M"], + uproar: ["9M"], + }, + }, + crabominable: { + learnset: { + amnesia: ["9M"], + avalanche: ["9M"], + blizzard: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + chillingwater: ["9M"], + closecombat: ["9M"], + coaching: ["9M"], + crabhammer: ["9M"], + dig: ["9M"], + drainpunch: ["9M"], + dynamicpunch: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + gunkshot: ["9M"], + hardpress: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icehammer: ["9M"], + icepunch: ["9M"], + icespinner: ["9M"], + iciclespear: ["9M"], + icywind: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + knockoff: ["9M"], + liquidation: ["9M"], + machpunch: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + payback: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scaryface: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + swagger: ["9M"], + thief: ["9M"], + thunderpunch: ["9M"], + upperhand: ["9M"], + wideguard: ["9M"], + zenheadbutt: ["9M"], + }, + }, + lycanroc: { + learnset: { + accelerock: ["9M"], + agility: ["9M"], + assurance: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + charm: ["9M"], + closecombat: ["9M"], + crunch: ["9M"], + dig: ["9M"], + doubleteam: ["9M"], + doubleedge: ["9M"], + drillrun: ["9M"], + earthpower: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + firefang: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + howl: ["9M"], + hypervoice: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + lastresort: ["9M"], + mudslap: ["9M"], + playrough: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + quickattack: ["9M"], + quickguard: ["9M"], + rest: ["9M"], + roar: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + stealthrock: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + tailslap: ["9M"], + taunt: ["9M"], + thrash: ["9M"], + thunderfang: ["9M"], + trailblaze: ["9M"], + zenheadbutt: ["9M"], + }, + }, + lycanrocmidnight: { + learnset: { + bite: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + charm: ["9M"], + closecombat: ["9M"], + counter: ["9M"], + crunch: ["9M"], + dig: ["9M"], + doubleteam: ["9M"], + doubleedge: ["9M"], + earthpower: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + firefang: ["9M"], + firepunch: ["9M"], + fling: ["9M"], + focuspunch: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + howl: ["9M"], + hypervoice: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + lashout: ["9M"], + lastresort: ["9M"], + lowsweep: ["9M"], + megakick: ["9M"], + mudslap: ["9M"], + outrage: ["9M"], + payback: ["9M"], + playrough: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roar: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + stealthrock: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + thrash: ["9M"], + throatchop: ["9M"], + thunderfang: ["9M"], + thunderpunch: ["9M"], + trailblaze: ["9M"], + upperhand: ["9M"], + uproar: ["9M"], + zenheadbutt: ["9M"], + }, + }, + lycanrocdusk: { + learnset: { + accelerock: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + charm: ["9M"], + closecombat: ["9M"], + counter: ["9M"], + crunch: ["9M"], + crushclaw: ["9M"], + dig: ["9M"], + doubleteam: ["9M"], + doubleedge: ["9M"], + drillrun: ["9M"], + earthpower: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + firefang: ["9M"], + focusenergy: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + howl: ["9M"], + hypervoice: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + lastresort: ["9M"], + mudslap: ["9M"], + outrage: ["9M"], + playrough: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + quickattack: ["9M"], + quickguard: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roar: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + stealthrock: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + swordsdance: ["9M"], + tailslap: ["9M"], + taunt: ["9M"], + thrash: ["9M"], + throatchop: ["9M"], + thunderfang: ["9M"], + trailblaze: ["9M"], + zenheadbutt: ["9M"], + }, + }, + toxapex: { + learnset: { + acidspray: ["9M"], + banefulbunker: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + chillingwater: ["9M"], + crosspoison: ["9M"], + endure: ["9M"], + facade: ["9M"], + gigaimpact: ["9M"], + gunkshot: ["9M"], + haze: ["9M"], + hex: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icespinner: ["9M"], + icywind: ["9M"], + infestation: ["9M"], + irondefense: ["9M"], + lightscreen: ["9M"], + liquidation: ["9M"], + lunge: ["9M"], + mudshot: ["9M"], + muddywater: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + pinmissile: ["9M"], + poisonjab: ["9M"], + pounce: ["9M"], + protect: ["9M"], + raindance: ["9M"], + recover: ["9M"], + rest: ["9M"], + round: ["9M"], + scaryface: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + sludgewave: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + spitup: ["9M"], + stockpile: ["9M"], + substitute: ["9M"], + surf: ["9M"], + swallow: ["9M"], + toxic: ["9M"], + toxicspikes: ["9M"], + venoshock: ["9M"], + waterpulse: ["9M"], + wideguard: ["9M"], + }, + }, + mudsdale: { + learnset: { + bodypress: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + closecombat: ["9M"], + counter: ["9M"], + curse: ["9M"], + doubleedge: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fissure: ["9M"], + focusblast: ["9M"], + gigaimpact: ["9M"], + heavyslam: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + lashout: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + megakick: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + payback: ["9M"], + protect: ["9M"], + rest: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandtomb: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + stealthrock: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + }, + }, + araquanid: { + learnset: { + aquaring: ["9M"], + attract: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + bugbite: ["9M"], + bugbuzz: ["9M"], + chillingwater: ["9M"], + crunch: ["9M"], + dive: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + entrainment: ["9M"], + facade: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icywind: ["9M"], + infestation: ["9M"], + irondefense: ["9M"], + leechlife: ["9M"], + liquidation: ["9M"], + lunge: ["9M"], + magicroom: ["9M"], + mirrorcoat: ["9M"], + poisonjab: ["9M"], + pounce: ["9M"], + powersplit: ["9M"], + protect: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + round: ["9M"], + scaryface: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + soak: ["9M"], + spitup: ["9M"], + stickyweb: ["9M"], + stockpile: ["9M"], + substitute: ["9M"], + surf: ["9M"], + trailblaze: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + wideguard: ["9M"], + wonderroom: ["9M"], + xscissor: ["9M"], + }, + }, + salazzle: { + learnset: { + acidspray: ["9M"], + acrobatics: ["9M"], + agility: ["9M"], + beatup: ["9M"], + belch: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + burningjealousy: ["9M"], + corrosivegas: ["9M"], + crosspoison: ["9M"], + disable: ["9M"], + dragoncheer: ["9M"], + dragonclaw: ["9M"], + dragondance: ["9M"], + dragonpulse: ["9M"], + dragontail: ["9M"], + encore: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + faketears: ["9M"], + fireblast: ["9M"], + firefang: ["9M"], + firelash: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + fling: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + gunkshot: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + leechlife: ["9M"], + mudslap: ["9M"], + nastyplot: ["9M"], + overheat: ["9M"], + payback: ["9M"], + poisonfang: ["9M"], + poisonjab: ["9M"], + protect: ["9M"], + rest: ["9M"], + round: ["9M"], + scaleshot: ["9M"], + scaryface: ["9M"], + shadowclaw: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + sludgewave: ["9M"], + snore: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swagger: ["9M"], + sweetscent: ["9M"], + taunt: ["9M"], + temperflare: ["9M"], + thief: ["9M"], + thunderwave: ["9M"], + torment: ["9M"], + toxic: ["9M"], + toxicspikes: ["9M"], + trailblaze: ["9M"], + venoshock: ["9M"], + willowisp: ["9M"], + }, + }, + tsareena: { + learnset: { + acrobatics: ["9M"], + acupressure: ["9M"], + aromaticmist: ["9M"], + bounce: ["9M"], + bulletseed: ["9M"], + charm: ["9M"], + dazzlinggleam: ["9M"], + drainingkiss: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + flail: ["9M"], + fling: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + grassyterrain: ["9M"], + helpinghand: ["9M"], + highjumpkick: ["9M"], + hyperbeam: ["9M"], + knockoff: ["9M"], + leafstorm: ["9M"], + lightscreen: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + megakick: ["9M"], + payback: ["9M"], + petalblizzard: ["9M"], + playrough: ["9M"], + powerwhip: ["9M"], + protect: ["9M"], + rapidspin: ["9M"], + reflect: ["9M"], + rest: ["9M"], + round: ["9M"], + seedbomb: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + solarblade: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swagger: ["9M"], + sweetscent: ["9M"], + synthesis: ["9M"], + taunt: ["9M"], + teeterdance: ["9M"], + trailblaze: ["9M"], + tripleaxel: ["9M"], + tropkick: ["9M"], + uturn: ["9M"], + zenheadbutt: ["9M"], + }, + }, + oranguru: { + learnset: { + afteryou: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulldoze: ["9M"], + calmmind: ["9M"], + chargebeam: ["9M"], + chillingwater: ["9M"], + earthquake: ["9M"], + encore: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + energyball: ["9M"], + expandingforce: ["9M"], + extrasensory: ["9M"], + facade: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + foulplay: ["9M"], + futuresight: ["9M"], + gigaimpact: ["9M"], + gravity: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + imprison: ["9M"], + instruct: ["9M"], + knockoff: ["9M"], + lastresort: ["9M"], + lightscreen: ["9M"], + magicroom: ["9M"], + megakick: ["9M"], + nastyplot: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psychicnoise: ["9M"], + psychicterrain: ["9M"], + psyshock: ["9M"], + quash: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + round: ["9M"], + safeguard: ["9M"], + scaryface: ["9M"], + shadowball: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + taunt: ["9M"], + terrainpulse: ["9M"], + thunder: ["9M"], + thunderbolt: ["9M"], + trailblaze: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + wonderroom: ["9M"], + yawn: ["9M"], + zenheadbutt: ["9M"], + }, + }, + passimian: { + learnset: { + acrobatics: ["9M"], + assurance: ["9M"], + batonpass: ["9M"], + beatup: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + chillingwater: ["9M"], + closecombat: ["9M"], + coaching: ["9M"], + counter: ["9M"], + curse: ["9M"], + doubleedge: ["9M"], + drainpunch: ["9M"], + earthquake: ["9M"], + electroweb: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + feint: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focusenergy: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gunkshot: ["9M"], + gyroball: ["9M"], + hyperbeam: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + knockoff: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + megakick: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + quickguard: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + scaryface: ["9M"], + seedbomb: ["9M"], + seismictoss: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + snore: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + taunt: ["9M"], + thief: ["9M"], + thrash: ["9M"], + trailblaze: ["9M"], + uturn: ["9M"], + upperhand: ["9M"], + uproar: ["9M"], + vacuumwave: ["9M"], + }, + }, + mimikyu: { + learnset: { + babydolleyes: ["9M"], + beatup: ["9M"], + bulkup: ["9M"], + burningjealousy: ["9M"], + charm: ["9M"], + confuseray: ["9M"], + copycat: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + dazzlinggleam: ["9M"], + destinybond: ["9M"], + doubleteam: ["9M"], + drainpunch: ["9M"], + drainingkiss: ["9M"], + endure: ["9M"], + facade: ["9M"], + fling: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + leechlife: ["9M"], + lightscreen: ["9M"], + magicroom: ["9M"], + mistyterrain: ["9M"], + nightshade: ["9M"], + nightslash: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + phantomforce: ["9M"], + playrough: ["9M"], + pounce: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + raindance: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + screech: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + shadowsneak: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + spite: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + thief: ["9M"], + thunder: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + trailblaze: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + willowisp: ["9M"], + woodhammer: ["9M"], + xscissor: ["9M"], + }, + }, + drampa: { + learnset: { + amnesia: ["9M"], + attract: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + bulldoze: ["9M"], + calmmind: ["9M"], + dracometeor: ["9M"], + dragoncheer: ["9M"], + dragonclaw: ["9M"], + dragondance: ["9M"], + dragonpulse: ["9M"], + dragonrush: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + energyball: ["9M"], + extrasensory: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + flamethrower: ["9M"], + fling: ["9M"], + fly: ["9M"], + focusblast: ["9M"], + gigaimpact: ["9M"], + glare: ["9M"], + grassknot: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + hurricane: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icebeam: ["9M"], + icywind: ["9M"], + lashout: ["9M"], + lightscreen: ["9M"], + outrage: ["9M"], + playrough: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + roost: ["9M"], + round: ["9M"], + safeguard: ["9M"], + scaleshot: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + steelwing: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + surf: ["9M"], + thunder: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + tickle: ["9M"], + triattack: ["9M"], + uproar: ["9M"], + whirlwind: ["9M"], + }, + }, + kommoo: { + learnset: { + aerialace: ["9M"], + attract: ["9M"], + aurasphere: ["9M"], + bellydrum: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + boomburst: ["9M"], + breakingswipe: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulkup: ["9M"], + bulldoze: ["9M"], + clangingscales: ["9M"], + clangoroussoul: ["9M"], + closecombat: ["9M"], + coaching: ["9M"], + counter: ["9M"], + doubleedge: ["9M"], + dracometeor: ["9M"], + dragoncheer: ["9M"], + dragonclaw: ["9M"], + dragondance: ["9M"], + dragonpulse: ["9M"], + dragontail: ["9M"], + drainpunch: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + firepunch: ["9M"], + flamethrower: ["9M"], + flashcannon: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icepunch: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + lowkick: ["9M"], + megakick: ["9M"], + metalsound: ["9M"], + nobleroar: ["9M"], + outrage: ["9M"], + payback: ["9M"], + poisonjab: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandstorm: ["9M"], + scaleshot: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + stealthrock: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + throatchop: ["9M"], + thunderpunch: ["9M"], + upperhand: ["9M"], + uproar: ["9M"], + vacuumwave: ["9M"], + xscissor: ["9M"], + }, + }, + corviknight: { + learnset: { + aerialace: ["9M"], + agility: ["9M"], + aircutter: ["9M"], + airslash: ["9M"], + assurance: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + bravebird: ["9M"], + bulkup: ["9M"], + curse: ["9M"], + defog: ["9M"], + doubleedge: ["9M"], + drillpeck: ["9M"], + dualwingbeat: ["9M"], + endure: ["9M"], + facade: ["9M"], + faketears: ["9M"], + featherdance: ["9M"], + flashcannon: ["9M"], + fly: ["9M"], + focusenergy: ["9M"], + gigaimpact: ["9M"], + heavyslam: ["9M"], + hurricane: ["9M"], + hyperbeam: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + lightscreen: ["9M"], + metalsound: ["9M"], + nastyplot: ["9M"], + payback: ["9M"], + pluck: ["9M"], + powertrip: ["9M"], + protect: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roost: ["9M"], + round: ["9M"], + scaryface: ["9M"], + screech: ["9M"], + skyattack: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + spite: ["9M"], + steelbeam: ["9M"], + steelwing: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swagger: ["9M"], + tailwind: ["9M"], + taunt: ["9M"], + thief: ["9M"], + uturn: ["9M"], + }, + }, + flapple: { + learnset: { + acidspray: ["9M"], + acrobatics: ["9M"], + aerialace: ["9M"], + airslash: ["9M"], + bulletseed: ["9M"], + dracometeor: ["9M"], + dragondance: ["9M"], + dragonpulse: ["9M"], + dragonrush: ["9M"], + dualwingbeat: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + fly: ["9M"], + focusenergy: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + grassyterrain: ["9M"], + gravapple: ["9M"], + growth: ["9M"], + heavyslam: ["9M"], + hyperbeam: ["9M"], + irondefense: ["9M"], + leafstorm: ["9M"], + leechseed: ["9M"], + outrage: ["9M"], + pounce: ["9M"], + protect: ["9M"], + recycle: ["9M"], + rest: ["9M"], + round: ["9M"], + scaryface: ["9M"], + seedbomb: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + trailblaze: ["9M"], + uturn: ["9M"], + }, + }, + appletun: { + learnset: { + amnesia: ["9M"], + appleacid: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + bulletseed: ["9M"], + curse: ["9M"], + dracometeor: ["9M"], + dragonpulse: ["9M"], + dragontail: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + grassyterrain: ["9M"], + growth: ["9M"], + gyroball: ["9M"], + heavyslam: ["9M"], + helpinghand: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + leafstorm: ["9M"], + leechseed: ["9M"], + lightscreen: ["9M"], + outrage: ["9M"], + pounce: ["9M"], + protect: ["9M"], + raindance: ["9M"], + recover: ["9M"], + recycle: ["9M"], + reflect: ["9M"], + rest: ["9M"], + round: ["9M"], + seedbomb: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + superpower: ["9M"], + sweetscent: ["9M"], + trailblaze: ["9M"], + zenheadbutt: ["9M"], + }, + }, + sandaconda: { + learnset: { + belch: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + coil: ["9M"], + dig: ["9M"], + dragonrush: ["9M"], + drillrun: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + firefang: ["9M"], + gigaimpact: ["9M"], + glare: ["9M"], + highhorsepower: ["9M"], + hurricane: ["9M"], + hyperbeam: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + lastresort: ["9M"], + minimize: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + outrage: ["9M"], + protect: ["9M"], + rest: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + sandtomb: ["9M"], + sandstorm: ["9M"], + scaleshot: ["9M"], + scaryface: ["9M"], + scorchingsands: ["9M"], + screech: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + stealthrock: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + thunderfang: ["9M"], + wrap: ["9M"], + zenheadbutt: ["9M"], + }, + }, + polteageist: { + learnset: { + allyswitch: ["9M"], + aromaticmist: ["9M"], + batonpass: ["9M"], + calmmind: ["9M"], + confuseray: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + endure: ["9M"], + facade: ["9M"], + foulplay: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + imprison: ["9M"], + lightscreen: ["9M"], + memento: ["9M"], + nastyplot: ["9M"], + nightshade: ["9M"], + painsplit: ["9M"], + payback: ["9M"], + phantomforce: ["9M"], + poltergeist: ["9M"], + protect: ["9M"], + psychic: ["9M"], + psyshock: ["9M"], + reflect: ["9M"], + rest: ["9M"], + round: ["9M"], + selfdestruct: ["9M"], + shadowball: ["9M"], + shellsmash: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + spite: ["9M"], + storedpower: ["9M"], + strengthsap: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sweetscent: ["9M"], + teatime: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + willowisp: ["9M"], + wonderroom: ["9M"], + }, + }, + polteageistantique: {}, + hatterene: { + learnset: { + afteryou: ["9M"], + agility: ["9M"], + aromaticmist: ["9M"], + batonpass: ["9M"], + brutalswing: ["9M"], + calmmind: ["9M"], + charm: ["9M"], + darkpulse: ["9M"], + dazzlinggleam: ["9M"], + drainingkiss: ["9M"], + endure: ["9M"], + expandingforce: ["9M"], + facade: ["9M"], + futuresight: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + gravity: ["9M"], + guardswap: ["9M"], + healpulse: ["9M"], + healingwish: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + imprison: ["9M"], + lifedew: ["9M"], + lightscreen: ["9M"], + magicpowder: ["9M"], + magicroom: ["9M"], + mistyexplosion: ["9M"], + mistyterrain: ["9M"], + mysticalfire: ["9M"], + nuzzle: ["9M"], + painsplit: ["9M"], + playrough: ["9M"], + powerswap: ["9M"], + powerwhip: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psychicnoise: ["9M"], + psychicterrain: ["9M"], + psychocut: ["9M"], + psyshock: ["9M"], + quash: ["9M"], + reflect: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + swordsdance: ["9M"], + thunderwave: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + wonderroom: ["9M"], + }, + }, + mrrime: { + learnset: { + afteryou: ["9M"], + allyswitch: ["9M"], + attract: ["9M"], + avalanche: ["9M"], + batonpass: ["9M"], + blizzard: ["9M"], + block: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + calmmind: ["9M"], + charm: ["9M"], + chillingwater: ["9M"], + confuseray: ["9M"], + copycat: ["9M"], + dazzlinggleam: ["9M"], + drainpunch: ["9M"], + encore: ["9M"], + endure: ["9M"], + energyball: ["9M"], + expandingforce: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + faketears: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + foulplay: ["9M"], + freezedry: ["9M"], + frostbreath: ["9M"], + futuresight: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + guardswap: ["9M"], + haze: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + hypnosis: ["9M"], + icebeam: ["9M"], + icepunch: ["9M"], + iceshard: ["9M"], + icespinner: ["9M"], + iciclespear: ["9M"], + icywind: ["9M"], + irondefense: ["9M"], + lightscreen: ["9M"], + magicroom: ["9M"], + megakick: ["9M"], + mirrorcoat: ["9M"], + mistyterrain: ["9M"], + nastyplot: ["9M"], + payback: ["9M"], + powersplit: ["9M"], + powerswap: ["9M"], + protect: ["9M"], + psychic: ["9M"], + psychicterrain: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + rapidspin: ["9M"], + recycle: ["9M"], + reflect: ["9M"], + rest: ["9M"], + roleplay: ["9M"], + round: ["9M"], + safeguard: ["9M"], + screech: ["9M"], + shadowball: ["9M"], + sheercold: ["9M"], + skillswap: ["9M"], + slackoff: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + snowscape: ["9M"], + solarbeam: ["9M"], + stompingtantrum: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + swagger: ["9M"], + taunt: ["9M"], + teeterdance: ["9M"], + thief: ["9M"], + thunder: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + tickle: ["9M"], + torment: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + tripleaxel: ["9M"], + uproar: ["9M"], + wonderroom: ["9M"], + zenheadbutt: ["9M"], + }, + }, + runerigus: { + learnset: { + allyswitch: ["9M"], + amnesia: ["9M"], + attract: ["9M"], + bodypress: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + calmmind: ["9M"], + confuseray: ["9M"], + curse: ["9M"], + darkpulse: ["9M"], + destinybond: ["9M"], + disable: ["9M"], + dragonpulse: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + faketears: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + guardsplit: ["9M"], + guardswap: ["9M"], + haze: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + imprison: ["9M"], + irondefense: ["9M"], + meanlook: ["9M"], + memento: ["9M"], + nastyplot: ["9M"], + nightshade: ["9M"], + payback: ["9M"], + phantomforce: ["9M"], + poltergeist: ["9M"], + powersplit: ["9M"], + powerswap: ["9M"], + protect: ["9M"], + psychic: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + rest: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + round: ["9M"], + safeguard: ["9M"], + sandtomb: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + selfdestruct: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + shadowpunch: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + stealthrock: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + taunt: ["9M"], + thief: ["9M"], + toxicspikes: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + willowisp: ["9M"], + wonderroom: ["9M"], + zenheadbutt: ["9M"], + }, + }, + alcremie: { + learnset: { + acidarmor: ["9M"], + alluringvoice: ["9M"], + aromaticmist: ["9M"], + attract: ["9M"], + babydolleyes: ["9M"], + calmmind: ["9M"], + charm: ["9M"], + dazzlinggleam: ["9M"], + decorate: ["9M"], + drainpunch: ["9M"], + drainingkiss: ["9M"], + encore: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + energyball: ["9M"], + entrainment: ["9M"], + facade: ["9M"], + faketears: ["9M"], + fling: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + imprison: ["9M"], + lastresort: ["9M"], + lightscreen: ["9M"], + magicroom: ["9M"], + mistyexplosion: ["9M"], + mistyterrain: ["9M"], + mysticalfire: ["9M"], + painsplit: ["9M"], + playrough: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psyshock: ["9M"], + recover: ["9M"], + rest: ["9M"], + round: ["9M"], + safeguard: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sweetkiss: ["9M"], + sweetscent: ["9M"], + triattack: ["9M"], + wonderroom: ["9M"], + }, + }, + morpeko: { + learnset: { + agility: ["9M"], + assurance: ["9M"], + aurawheel: ["9M"], + batonpass: ["9M"], + bite: ["9M"], + brickbreak: ["9M"], + bulletseed: ["9M"], + charge: ["9M"], + chargebeam: ["9M"], + crunch: ["9M"], + darkpulse: ["9M"], + doubleedge: ["9M"], + eerieimpulse: ["9M"], + electricterrain: ["9M"], + electroball: ["9M"], + electroweb: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + faketears: ["9M"], + firefang: ["9M"], + flatter: ["9M"], + fling: ["9M"], + foulplay: ["9M"], + icefang: ["9M"], + knockoff: ["9M"], + lashout: ["9M"], + nastyplot: ["9M"], + outrage: ["9M"], + partingshot: ["9M"], + payback: ["9M"], + powertrip: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + quash: ["9M"], + quickattack: ["9M"], + rapidspin: ["9M"], + rest: ["9M"], + reversal: ["9M"], + risingvoltage: ["9M"], + round: ["9M"], + scaryface: ["9M"], + seedbomb: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + snore: ["9M"], + spite: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + superfang: ["9M"], + swagger: ["9M"], + taunt: ["9M"], + thief: ["9M"], + thrash: ["9M"], + thunder: ["9M"], + thunderfang: ["9M"], + thunderpunch: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + tickle: ["9M"], + torment: ["9M"], + uproar: ["9M"], + voltswitch: ["9M"], + wildcharge: ["9M"], + }, + }, + dragapult: { + learnset: { + acrobatics: ["9M"], + agility: ["9M"], + assurance: ["9M"], + batonpass: ["9M"], + beatup: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + confuseray: ["9M"], + curse: ["9M"], + disable: ["9M"], + dive: ["9M"], + doublehit: ["9M"], + doubleteam: ["9M"], + doubleedge: ["9M"], + dracometeor: ["9M"], + dragoncheer: ["9M"], + dragonclaw: ["9M"], + dragondance: ["9M"], + dragondarts: ["9M"], + dragonpulse: ["9M"], + dragonrush: ["9M"], + dragontail: ["9M"], + endure: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + flamethrower: ["9M"], + fly: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + hex: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + infestation: ["9M"], + lastresort: ["9M"], + lightscreen: ["9M"], + lockon: ["9M"], + nightshade: ["9M"], + outrage: ["9M"], + phantomforce: ["9M"], + pounce: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + quickattack: ["9M"], + reflect: ["9M"], + rest: ["9M"], + round: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + snore: ["9M"], + solarbeam: ["9M"], + steelwing: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + surf: ["9M"], + thief: ["9M"], + thunder: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + triattack: ["9M"], + uturn: ["9M"], + willowisp: ["9M"], + }, + }, + wyrdeer: { + learnset: { + agility: ["9M"], + bite: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + calmmind: ["9M"], + chargebeam: ["9M"], + confuseray: ["9M"], + curse: ["9M"], + dig: ["9M"], + disable: ["9M"], + doubleedge: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + energyball: ["9M"], + expandingforce: ["9M"], + extrasensory: ["9M"], + facade: ["9M"], + futuresight: ["9M"], + gigaimpact: ["9M"], + gravity: ["9M"], + helpinghand: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + hypnosis: ["9M"], + imprison: ["9M"], + lightscreen: ["9M"], + lunge: ["9M"], + megahorn: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psychicnoise: ["9M"], + psyshieldbash: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + roar: ["9M"], + roleplay: ["9M"], + scaryface: ["9M"], + shadowball: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + solarbeam: ["9M"], + spite: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + thief: ["9M"], + thrash: ["9M"], + throatchop: ["9M"], + thunder: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + trailblaze: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + uproar: ["9M"], + wildcharge: ["9M"], + zenheadbutt: ["9M"], + }, + }, + kleavor: { + learnset: { + acrobatics: ["9M"], + aerialace: ["9M"], + agility: ["9M"], + aircutter: ["9M"], + airslash: ["9M"], + ancientpower: ["9M"], + batonpass: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bugbite: ["9M"], + bugbuzz: ["9M"], + closecombat: ["9M"], + counter: ["9M"], + defog: ["9M"], + doublehit: ["9M"], + doubleteam: ["9M"], + doubleedge: ["9M"], + dualwingbeat: ["9M"], + endure: ["9M"], + facade: ["9M"], + feint: ["9M"], + focusenergy: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + lightscreen: ["9M"], + lunge: ["9M"], + nightslash: ["9M"], + pounce: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + quickguard: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + stealthrock: ["9M"], + stoneaxe: ["9M"], + stoneedge: ["9M"], + strugglebug: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + tailwind: ["9M"], + thief: ["9M"], + trailblaze: ["9M"], + uturn: ["9M"], + vacuumwave: ["9M"], + xscissor: ["9M"], + }, + }, + basculegion: { + learnset: { + agility: ["9M"], + aquajet: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + chillingwater: ["9M"], + confuseray: ["9M"], + crunch: ["9M"], + doubleedge: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + flail: ["9M"], + flipturn: ["9M"], + gigaimpact: ["9M"], + headsmash: ["9M"], + hex: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icefang: ["9M"], + icywind: ["9M"], + lastrespects: ["9M"], + liquidation: ["9M"], + mudshot: ["9M"], + muddywater: ["9M"], + nightshade: ["9M"], + outrage: ["9M"], + painsplit: ["9M"], + phantomforce: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + raindance: ["9M"], + rest: ["9M"], + scaleshot: ["9M"], + scaryface: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + snowscape: ["9M"], + soak: ["9M"], + spite: ["9M"], + substitute: ["9M"], + surf: ["9M"], + thrash: ["9M"], + uproar: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + wavecrash: ["9M"], + whirlpool: ["9M"], + zenheadbutt: ["9M"], + }, + }, + basculegionf: { + learnset: { + agility: ["9M"], + aquajet: ["9M"], + bite: ["9M"], + blizzard: ["9M"], + chillingwater: ["9M"], + confuseray: ["9M"], + crunch: ["9M"], + doubleedge: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + flail: ["9M"], + flipturn: ["9M"], + gigaimpact: ["9M"], + headsmash: ["9M"], + hex: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icebeam: ["9M"], + icefang: ["9M"], + icywind: ["9M"], + lastrespects: ["9M"], + liquidation: ["9M"], + mudshot: ["9M"], + muddywater: ["9M"], + nightshade: ["9M"], + outrage: ["9M"], + painsplit: ["9M"], + phantomforce: ["9M"], + protect: ["9M"], + psychicfangs: ["9M"], + raindance: ["9M"], + rest: ["9M"], + scaleshot: ["9M"], + scaryface: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + snowscape: ["9M"], + soak: ["9M"], + spite: ["9M"], + substitute: ["9M"], + surf: ["9M"], + thrash: ["9M"], + uproar: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + wavecrash: ["9M"], + whirlpool: ["9M"], + zenheadbutt: ["9M"], + }, + }, + sneasler: { + learnset: { + acidspray: ["9M"], + acrobatics: ["9M"], + aerialace: ["9M"], + agility: ["9M"], + brickbreak: ["9M"], + bulkup: ["9M"], + calmmind: ["9M"], + closecombat: ["9M"], + coaching: ["9M"], + counter: ["9M"], + dig: ["9M"], + direclaw: ["9M"], + doublehit: ["9M"], + endure: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + feint: ["9M"], + firepunch: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gunkshot: ["9M"], + hyperbeam: ["9M"], + lashout: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + nastyplot: ["9M"], + nightslash: ["9M"], + poisonjab: ["9M"], + protect: ["9M"], + quickattack: ["9M"], + quickguard: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + screech: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + sludgewave: ["9M"], + spite: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + switcheroo: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + toxic: ["9M"], + toxicspikes: ["9M"], + trailblaze: ["9M"], + uturn: ["9M"], + upperhand: ["9M"], + vacuumwave: ["9M"], + venoshock: ["9M"], + xscissor: ["9M"], + }, + }, + meowscarada: { + learnset: { + acrobatics: ["9M"], + aerialace: ["9M"], + agility: ["9M"], + allyswitch: ["9M"], + aurasphere: ["9M"], + bite: ["9M"], + brickbreak: ["9M"], + bulletseed: ["9M"], + charm: ["9M"], + chillingwater: ["9M"], + copycat: ["9M"], + darkpulse: ["9M"], + doubleteam: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + faketears: ["9M"], + fling: ["9M"], + flowertrick: ["9M"], + foulplay: ["9M"], + frenzyplant: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + grassyterrain: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + knockoff: ["9M"], + lashout: ["9M"], + leafstorm: ["9M"], + leechseed: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + mudslap: ["9M"], + nastyplot: ["9M"], + nightslash: ["9M"], + petalblizzard: ["9M"], + playrough: ["9M"], + pollenpuff: ["9M"], + powergem: ["9M"], + protect: ["9M"], + psychup: ["9M"], + quickattack: ["9M"], + rest: ["9M"], + seedbomb: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + solarbeam: ["9M"], + spikes: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + taunt: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + thunderpunch: ["9M"], + toxicspikes: ["9M"], + trailblaze: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + tripleaxel: ["9M"], + uturn: ["9M"], + worryseed: ["9M"], + }, + }, + skeledirge: { + learnset: { + alluringvoice: ["9M"], + belch: ["9M"], + bite: ["9M"], + blastburn: ["9M"], + bodyslam: ["9M"], + burnup: ["9M"], + crunch: ["9M"], + curse: ["9M"], + dig: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + encore: ["9M"], + endure: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firefang: ["9M"], + firespin: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + gigaimpact: ["9M"], + heatcrash: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + imprison: ["9M"], + mudslap: ["9M"], + nightshade: ["9M"], + outrage: ["9M"], + overheat: ["9M"], + poltergeist: ["9M"], + protect: ["9M"], + rest: ["9M"], + roar: ["9M"], + round: ["9M"], + scaryface: ["9M"], + scorchingsands: ["9M"], + seedbomb: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + sing: ["9M"], + slackoff: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + solarbeam: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + temperflare: ["9M"], + thunderfang: ["9M"], + torchsong: ["9M"], + willowisp: ["9M"], + yawn: ["9M"], + zenheadbutt: ["9M"], + }, + }, + quaquaval: { + learnset: { + acrobatics: ["9M"], + aerialace: ["9M"], + agility: ["9M"], + aircutter: ["9M"], + airslash: ["9M"], + aquacutter: ["9M"], + aquajet: ["9M"], + aquastep: ["9M"], + batonpass: ["9M"], + bravebird: ["9M"], + brickbreak: ["9M"], + bulkup: ["9M"], + chillingwater: ["9M"], + closecombat: ["9M"], + coaching: ["9M"], + counter: ["9M"], + detect: ["9M"], + doublehit: ["9M"], + encore: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + featherdance: ["9M"], + fling: ["9M"], + flipturn: ["9M"], + focusenergy: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + hurricane: ["9M"], + hydrocannon: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + icespinner: ["9M"], + icywind: ["9M"], + knockoff: ["9M"], + lastresort: ["9M"], + liquidation: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + megakick: ["9M"], + mistyterrain: ["9M"], + protect: ["9M"], + psychup: ["9M"], + raindance: ["9M"], + rapidspin: ["9M"], + rest: ["9M"], + reversal: ["9M"], + roost: ["9M"], + sleeptalk: ["9M"], + substitute: ["9M"], + surf: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + tripleaxel: ["9M"], + uturn: ["9M"], + upperhand: ["9M"], + waterpulse: ["9M"], + wavecrash: ["9M"], + whirlpool: ["9M"], + }, + }, + maushold: { + learnset: { + aerialace: ["9M"], + afteryou: ["9M"], + agility: ["9M"], + babydolleyes: ["9M"], + batonpass: ["9M"], + beatup: ["9M"], + bite: ["9M"], + bulletseed: ["9M"], + charm: ["9M"], + chillingwater: ["9M"], + copycat: ["9M"], + crunch: ["9M"], + dig: ["9M"], + doublehit: ["9M"], + doubleedge: ["9M"], + encore: ["9M"], + endure: ["9M"], + facade: ["9M"], + faketears: ["9M"], + feint: ["9M"], + followme: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + playrough: ["9M"], + populationbomb: ["9M"], + protect: ["9M"], + raindance: ["9M"], + rest: ["9M"], + seedbomb: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superfang: ["9M"], + switcheroo: ["9M"], + taunt: ["9M"], + thief: ["9M"], + thunderwave: ["9M"], + tickle: ["9M"], + tidyup: ["9M"], + trailblaze: ["9M"], + uturn: ["9M"], + waterpulse: ["9M"], + }, + }, + garganacl: { + learnset: { + ancientpower: ["9M"], + avalanche: ["9M"], + block: ["9M"], + bodypress: ["9M"], + bodyslam: ["9M"], + brickbreak: ["9M"], + bulldoze: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + dynamicpunch: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + explosion: ["9M"], + facade: ["9M"], + firepunch: ["9M"], + fissure: ["9M"], + flashcannon: ["9M"], + fling: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + gravity: ["9M"], + hammerarm: ["9M"], + hardpress: ["9M"], + heavyslam: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + icepunch: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + meteorbeam: ["9M"], + mudshot: ["9M"], + powergem: ["9M"], + protect: ["9M"], + raindance: ["9M"], + recover: ["9M"], + rest: ["9M"], + rockblast: ["9M"], + rockpolish: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + saltcure: ["9M"], + sandstorm: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + stealthrock: ["9M"], + stompingtantrum: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + thunderpunch: ["9M"], + wideguard: ["9M"], + zenheadbutt: ["9M"], + }, + }, + armarouge: { + learnset: { + acidspray: ["9M"], + allyswitch: ["9M"], + armorcannon: ["9M"], + aurasphere: ["9M"], + burnup: ["9M"], + calmmind: ["9M"], + clearsmog: ["9M"], + confuseray: ["9M"], + darkpulse: ["9M"], + destinybond: ["9M"], + disable: ["9M"], + dragonpulse: ["9M"], + endure: ["9M"], + energyball: ["9M"], + expandingforce: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firespin: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + flashcannon: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + irondefense: ["9M"], + lavaplume: ["9M"], + lightscreen: ["9M"], + meteorbeam: ["9M"], + mysticalfire: ["9M"], + nightshade: ["9M"], + overheat: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psychicterrain: ["9M"], + psyshock: ["9M"], + reflect: ["9M"], + rest: ["9M"], + scorchingsands: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + solarbeam: ["9M"], + spite: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + taunt: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + weatherball: ["9M"], + wideguard: ["9M"], + willowisp: ["9M"], + }, + }, + ceruledge: { + learnset: { + allyswitch: ["9M"], + bitterblade: ["9M"], + brickbreak: ["9M"], + bulkup: ["9M"], + burnup: ["9M"], + clearsmog: ["9M"], + closecombat: ["9M"], + confuseray: ["9M"], + curse: ["9M"], + destinybond: ["9M"], + disable: ["9M"], + dragonclaw: ["9M"], + endure: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firespin: ["9M"], + flamecharge: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + fling: ["9M"], + gigaimpact: ["9M"], + heatwave: ["9M"], + helpinghand: ["9M"], + hex: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + lavaplume: ["9M"], + lightscreen: ["9M"], + nightshade: ["9M"], + nightslash: ["9M"], + overheat: ["9M"], + phantomforce: ["9M"], + poisonjab: ["9M"], + poltergeist: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychocut: ["9M"], + quickguard: ["9M"], + reflect: ["9M"], + rest: ["9M"], + shadowball: ["9M"], + shadowclaw: ["9M"], + shadowsneak: ["9M"], + sleeptalk: ["9M"], + solarblade: ["9M"], + spite: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + throatchop: ["9M"], + vacuumwave: ["9M"], + willowisp: ["9M"], + xscissor: ["9M"], + }, + }, + bellibolt: { + learnset: { + acidspray: ["9M"], + charge: ["9M"], + chargebeam: ["9M"], + chillingwater: ["9M"], + confuseray: ["9M"], + discharge: ["9M"], + eerieimpulse: ["9M"], + electricterrain: ["9M"], + electroball: ["9M"], + electroweb: ["9M"], + endure: ["9M"], + flail: ["9M"], + gigaimpact: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + lightscreen: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + muddywater: ["9M"], + paraboliccharge: ["9M"], + protect: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + slackoff: ["9M"], + sleeptalk: ["9M"], + soak: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + supercellslam: ["9M"], + thunder: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + toxic: ["9M"], + voltswitch: ["9M"], + waterpulse: ["9M"], + weatherball: ["9M"], + wildcharge: ["9M"], + zapcannon: ["9M"], + }, + }, + scovillain: { + learnset: { + bite: ["9M"], + bulletseed: ["9M"], + burningjealousy: ["9M"], + crunch: ["9M"], + doublehit: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + fireblast: ["9M"], + firefang: ["9M"], + firespin: ["9M"], + flamethrower: ["9M"], + flareblitz: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + grassyterrain: ["9M"], + growth: ["9M"], + helpinghand: ["9M"], + hyperbeam: ["9M"], + ingrain: ["9M"], + lashout: ["9M"], + leafstorm: ["9M"], + leechseed: ["9M"], + overheat: ["9M"], + protect: ["9M"], + ragepowder: ["9M"], + rest: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + seedbomb: ["9M"], + sleeptalk: ["9M"], + solarbeam: ["9M"], + spicyextract: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + superfang: ["9M"], + swagger: ["9M"], + temperflare: ["9M"], + thief: ["9M"], + thunderfang: ["9M"], + trailblaze: ["9M"], + willowisp: ["9M"], + worryseed: ["9M"], + zenheadbutt: ["9M"], + }, + }, + espathra: { + learnset: { + aerialace: ["9M"], + agility: ["9M"], + allyswitch: ["9M"], + babydolleyes: ["9M"], + batonpass: ["9M"], + bodyslam: ["9M"], + bravebird: ["9M"], + calmmind: ["9M"], + confuseray: ["9M"], + dazzlinggleam: ["9M"], + doubleedge: ["9M"], + drillpeck: ["9M"], + endure: ["9M"], + energyball: ["9M"], + expandingforce: ["9M"], + facade: ["9M"], + featherdance: ["9M"], + flashcannon: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + helpinghand: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + hypnosis: ["9M"], + lastresort: ["9M"], + lightscreen: ["9M"], + lowkick: ["9M"], + luminacrash: ["9M"], + mudslap: ["9M"], + nightshade: ["9M"], + pluck: ["9M"], + pounce: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psychicterrain: ["9M"], + psyshock: ["9M"], + quickattack: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + roost: ["9M"], + sandstorm: ["9M"], + seedbomb: ["9M"], + shadowball: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + thief: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + uturn: ["9M"], + uproar: ["9M"], + zenheadbutt: ["9M"], + }, + }, + tinkaton: { + learnset: { + babydolleyes: ["9M"], + brickbreak: ["9M"], + brutalswing: ["9M"], + bulldoze: ["9M"], + covet: ["9M"], + drainingkiss: ["9M"], + encore: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fakeout: ["9M"], + faketears: ["9M"], + feint: ["9M"], + flashcannon: ["9M"], + flatter: ["9M"], + fling: ["9M"], + foulplay: ["9M"], + gigatonhammer: ["9M"], + hardpress: ["9M"], + heavyslam: ["9M"], + helpinghand: ["9M"], + icehammer: ["9M"], + knockoff: ["9M"], + lightscreen: ["9M"], + metalsound: ["9M"], + playrough: ["9M"], + pounce: ["9M"], + protect: ["9M"], + quash: ["9M"], + reflect: ["9M"], + rest: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + screech: ["9M"], + skillswap: ["9M"], + skittersmack: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + stealthrock: ["9M"], + steelbeam: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sweetkiss: ["9M"], + swordsdance: ["9M"], + thief: ["9M"], + thunderwave: ["9M"], + woodhammer: ["9M"], + }, + }, + palafin: { + learnset: { + acrobatics: ["9M"], + agility: ["9M"], + aquajet: ["9M"], + aquatail: ["9M"], + aurasphere: ["9M"], + blizzard: ["9M"], + bodyslam: ["9M"], + boomburst: ["9M"], + bounce: ["9M"], + bulkup: ["9M"], + charm: ["9M"], + chillingwater: ["9M"], + closecombat: ["9M"], + counter: ["9M"], + dive: ["9M"], + doublehit: ["9M"], + drainpunch: ["9M"], + drainingkiss: ["9M"], + encore: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + facade: ["9M"], + fling: ["9M"], + flipturn: ["9M"], + focusblast: ["9M"], + focusenergy: ["9M"], + focuspunch: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + hardpress: ["9M"], + haze: ["9M"], + helpinghand: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + icebeam: ["9M"], + icepunch: ["9M"], + icywind: ["9M"], + ironhead: ["9M"], + jetpunch: ["9M"], + liquidation: ["9M"], + outrage: ["9M"], + protect: ["9M"], + psychup: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + sleeptalk: ["9M"], + substitute: ["9M"], + surf: ["9M"], + taunt: ["9M"], + throatchop: ["9M"], + tickle: ["9M"], + waterpulse: ["9M"], + waterfall: ["9M"], + wavecrash: ["9M"], + whirlpool: ["9M"], + zenheadbutt: ["9M"], + }, + }, + orthworm: { + learnset: { + bodypress: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + coil: ["9M"], + curse: ["9M"], + dig: ["9M"], + doubleedge: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + facade: ["9M"], + flashcannon: ["9M"], + gigaimpact: ["9M"], + heavyslam: ["9M"], + helpinghand: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + irontail: ["9M"], + metalburst: ["9M"], + metalsound: ["9M"], + mudshot: ["9M"], + mudslap: ["9M"], + protect: ["9M"], + rest: ["9M"], + rockblast: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + sandtomb: ["9M"], + sandstorm: ["9M"], + shedtail: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + spikes: ["9M"], + stealthrock: ["9M"], + steelbeam: ["9M"], + stompingtantrum: ["9M"], + substitute: ["9M"], + wrap: ["9M"], + }, + }, + glimmora: { + learnset: { + acidarmor: ["9M"], + acidspray: ["9M"], + ancientpower: ["9M"], + confuseray: ["9M"], + dazzlinggleam: ["9M"], + earthpower: ["9M"], + endure: ["9M"], + energyball: ["9M"], + explosion: ["9M"], + facade: ["9M"], + flashcannon: ["9M"], + gigaimpact: ["9M"], + gunkshot: ["9M"], + hyperbeam: ["9M"], + irondefense: ["9M"], + lightscreen: ["9M"], + memento: ["9M"], + meteorbeam: ["9M"], + mortalspin: ["9M"], + mudshot: ["9M"], + powergem: ["9M"], + protect: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + rockblast: ["9M"], + rockpolish: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + sandtomb: ["9M"], + sandstorm: ["9M"], + selfdestruct: ["9M"], + sleeptalk: ["9M"], + sludgebomb: ["9M"], + sludgewave: ["9M"], + smackdown: ["9M"], + solarbeam: ["9M"], + spikes: ["9M"], + spikyshield: ["9M"], + stealthrock: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + toxic: ["9M"], + toxicspikes: ["9M"], + venoshock: ["9M"], + }, + }, + farigiraf: { + learnset: { + agility: ["9M"], + allyswitch: ["9M"], + amnesia: ["9M"], + assurance: ["9M"], + batonpass: ["9M"], + beatup: ["9M"], + bodyslam: ["9M"], + bulldoze: ["9M"], + calmmind: ["9M"], + chargebeam: ["9M"], + confuseray: ["9M"], + crunch: ["9M"], + curse: ["9M"], + dazzlinggleam: ["9M"], + doublehit: ["9M"], + doubleedge: ["9M"], + earthquake: ["9M"], + endeavor: ["9M"], + endure: ["9M"], + energyball: ["9M"], + expandingforce: ["9M"], + facade: ["9M"], + foulplay: ["9M"], + futuresight: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + gravity: ["9M"], + guardswap: ["9M"], + helpinghand: ["9M"], + highhorsepower: ["9M"], + hyperbeam: ["9M"], + hypervoice: ["9M"], + imprison: ["9M"], + ironhead: ["9M"], + lightscreen: ["9M"], + lowkick: ["9M"], + meanlook: ["9M"], + mirrorcoat: ["9M"], + nastyplot: ["9M"], + nightshade: ["9M"], + powerswap: ["9M"], + protect: ["9M"], + psychup: ["9M"], + psychic: ["9M"], + psychicfangs: ["9M"], + psychicnoise: ["9M"], + psychicterrain: ["9M"], + psyshock: ["9M"], + raindance: ["9M"], + reflect: ["9M"], + rest: ["9M"], + roar: ["9M"], + shadowball: ["9M"], + skillswap: ["9M"], + sleeptalk: ["9M"], + stompingtantrum: ["9M"], + storedpower: ["9M"], + substitute: ["9M"], + sunnyday: ["9M"], + thief: ["9M"], + thunder: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + trailblaze: ["9M"], + trick: ["9M"], + trickroom: ["9M"], + twinbeam: ["9M"], + uproar: ["9M"], + wish: ["9M"], + zenheadbutt: ["9M"], + }, + }, + kingambit: { + learnset: { + aerialace: ["9M"], + airslash: ["9M"], + assurance: ["9M"], + brickbreak: ["9M"], + darkpulse: ["9M"], + dig: ["9M"], + endure: ["9M"], + facade: ["9M"], + flashcannon: ["9M"], + fling: ["9M"], + focusblast: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + guillotine: ["9M"], + hyperbeam: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + kowtowcleave: ["9M"], + lashout: ["9M"], + lowkick: ["9M"], + lowsweep: ["9M"], + meanlook: ["9M"], + metalburst: ["9M"], + metalsound: ["9M"], + nightslash: ["9M"], + poisonjab: ["9M"], + protect: ["9M"], + quickguard: ["9M"], + raindance: ["9M"], + rest: ["9M"], + reversal: ["9M"], + rocktomb: ["9M"], + sandstorm: ["9M"], + scaryface: ["9M"], + shadowclaw: ["9M"], + sleeptalk: ["9M"], + snarl: ["9M"], + spite: ["9M"], + stealthrock: ["9M"], + steelbeam: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + swordsdance: ["9M"], + taunt: ["9M"], + thief: ["9M"], + throatchop: ["9M"], + thunderwave: ["9M"], + torment: ["9M"], + xscissor: ["9M"], + zenheadbutt: ["9M"], + }, + }, + sinistcha: { + learnset: { + calmmind: ["9M"], + curse: ["9M"], + endure: ["9M"], + energyball: ["9M"], + foulplay: ["9M"], + gigadrain: ["9M"], + grassyterrain: ["9M"], + hex: ["9M"], + hyperbeam: ["9M"], + imprison: ["9M"], + irondefense: ["9M"], + leafstorm: ["9M"], + lifedew: ["9M"], + matchagotcha: ["9M"], + memento: ["9M"], + nastyplot: ["9M"], + nightshade: ["9M"], + painsplit: ["9M"], + phantomforce: ["9M"], + poltergeist: ["9M"], + protect: ["9M"], + psychup: ["9M"], + ragepowder: ["9M"], + reflect: ["9M"], + rest: ["9M"], + scald: ["9M"], + shadowball: ["9M"], + sleeptalk: ["9M"], + solarbeam: ["9M"], + spite: ["9M"], + strengthsap: ["9M"], + stunspore: ["9M"], + substitute: ["9M"], + trickroom: ["9M"], + uproar: ["9M"], + }, + }, + sinistchamasterpiece: {}, + archaludon: { + learnset: { + aurasphere: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + brickbreak: ["9M"], + darkpulse: ["9M"], + doubleedge: ["9M"], + dracometeor: ["9M"], + dragoncheer: ["9M"], + dragonclaw: ["9M"], + dragonpulse: ["9M"], + dragontail: ["9M"], + earthquake: ["9M"], + electroshot: ["9M"], + endure: ["9M"], + facade: ["9M"], + flashcannon: ["9M"], + focusenergy: ["9M"], + foulplay: ["9M"], + gigaimpact: ["9M"], + gyroball: ["9M"], + hardpress: ["9M"], + heavyslam: ["9M"], + hyperbeam: ["9M"], + irondefense: ["9M"], + ironhead: ["9M"], + lightscreen: ["9M"], + metalburst: ["9M"], + metalsound: ["9M"], + meteorbeam: ["9M"], + mirrorcoat: ["9M"], + nightslash: ["9M"], + outrage: ["9M"], + protect: ["9M"], + reflect: ["9M"], + rest: ["9M"], + roar: ["9M"], + rockslide: ["9M"], + rocktomb: ["9M"], + scaryface: ["9M"], + sleeptalk: ["9M"], + smackdown: ["9M"], + snarl: ["9M"], + solarbeam: ["9M"], + stealthrock: ["9M"], + steelbeam: ["9M"], + stoneedge: ["9M"], + substitute: ["9M"], + swordsdance: ["9M"], + thunder: ["9M"], + thunderwave: ["9M"], + thunderbolt: ["9M"], + }, + }, + hydrapple: { + learnset: { + bodypress: ["9M"], + bodyslam: ["9M"], + breakingswipe: ["9M"], + bugbite: ["9M"], + bulletseed: ["9M"], + curse: ["9M"], + doublehit: ["9M"], + doubleedge: ["9M"], + dracometeor: ["9M"], + dragoncheer: ["9M"], + dragonpulse: ["9M"], + dragontail: ["9M"], + earthpower: ["9M"], + earthquake: ["9M"], + endure: ["9M"], + energyball: ["9M"], + facade: ["9M"], + ficklebeam: ["9M"], + gigadrain: ["9M"], + gigaimpact: ["9M"], + grassknot: ["9M"], + grassyglide: ["9M"], + grassyterrain: ["9M"], + growth: ["9M"], + gyroball: ["9M"], + heavyslam: ["9M"], + hydropump: ["9M"], + hyperbeam: ["9M"], + infestation: ["9M"], + leafstorm: ["9M"], + nastyplot: ["9M"], + outrage: ["9M"], + pollenpuff: ["9M"], + pounce: ["9M"], + powerwhip: ["9M"], + protect: ["9M"], + raindance: ["9M"], + recover: ["9M"], + recycle: ["9M"], + reflect: ["9M"], + rest: ["9M"], + seedbomb: ["9M"], + sleeptalk: ["9M"], + solarbeam: ["9M"], + substitute: ["9M"], + suckerpunch: ["9M"], + sunnyday: ["9M"], + sweetscent: ["9M"], + syrupbomb: ["9M"], + uproar: ["9M"], + yawn: ["9M"], + }, + }, +}; diff --git a/data/mods/champions/moves.ts b/data/mods/champions/moves.ts new file mode 100644 index 0000000000..00b73821cf --- /dev/null +++ b/data/mods/champions/moves.ts @@ -0,0 +1,1109 @@ +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { + absorb: { + inherit: true, + isNonstandard: "Past", + }, + acid: { + inherit: true, + isNonstandard: "Past", + }, + aeroblast: { + inherit: true, + isNonstandard: "Past", + }, + anchorshot: { + inherit: true, + basePower: 90, + }, + appleacid: { + inherit: true, + basePower: 90, + }, + armthrust: { + inherit: true, + isNonstandard: "Past", + }, + astonish: { + inherit: true, + isNonstandard: "Past", + }, + astralbarrage: { + inherit: true, + basePower: 110, + isNonstandard: "Past", + }, + attackorder: { + inherit: true, + isNonstandard: "Past", + }, + aurorabeam: { + inherit: true, + isNonstandard: "Past", + }, + banefulbunker: { + inherit: true, + pp: 5, + }, + barbbarrage: { + inherit: true, + isNonstandard: "Past", + }, + beakblast: { + inherit: true, + basePower: 120, + pp: 5, + }, + behemothbash: { + inherit: true, + isNonstandard: "Past", + }, + behemothblade: { + inherit: true, + isNonstandard: "Past", + }, + blazingtorque: { + inherit: true, + isNonstandard: "Past", + }, + bleakwindstorm: { + inherit: true, + isNonstandard: "Past", + }, + bloodmoon: { + inherit: true, + basePower: 130, + isNonstandard: "Past", + }, + blueflare: { + inherit: true, + isNonstandard: "Past", + }, + boltbeak: { + inherit: true, + basePower: 80, + }, + boltstrike: { + inherit: true, + isNonstandard: "Past", + }, + bonerush: { + inherit: true, + basePower: 30, + }, + branchpoke: { + inherit: true, + isNonstandard: "Past", + }, + brine: { + inherit: true, + isNonstandard: "Past", + }, + bubblebeam: { + inherit: true, + isNonstandard: "Past", + }, + burningbulwark: { + inherit: true, + isNonstandard: "Past", + }, + burnup: { + inherit: true, + isNonstandard: null, + }, + celebrate: { + inherit: true, + isNonstandard: "Past", + }, + chloroblast: { + inherit: true, + isNonstandard: "Past", + }, + clangoroussoul: { + inherit: true, + accuracy: true, + }, + collisioncourse: { + inherit: true, + isNonstandard: "Past", + }, + combattorque: { + inherit: true, + isNonstandard: "Past", + }, + confide: { + inherit: true, + isNonstandard: "Past", + }, + confusion: { + inherit: true, + isNonstandard: "Past", + }, + conversion: { + inherit: true, + isNonstandard: "Past", + }, + conversion2: { + inherit: true, + isNonstandard: "Past", + }, + corrosivegas: { + inherit: true, + isNonstandard: null, + }, + courtchange: { + inherit: true, + isNonstandard: "Past", + }, + crabhammer: { + inherit: true, + accuracy: 95, + }, + crushclaw: { + inherit: true, + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, slicing: 1 }, + }, + crushgrip: { + inherit: true, + isNonstandard: "Past", + }, + cut: { + inherit: true, + isNonstandard: "Past", + }, + darkvoid: { + inherit: true, + isNonstandard: "Past", + }, + defendorder: { + inherit: true, + isNonstandard: "Past", + }, + defensecurl: { + inherit: true, + isNonstandard: "Past", + }, + diamondstorm: { + inherit: true, + isNonstandard: "Past", + }, + direclaw: { + inherit: true, + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, slicing: 1 }, + secondary: { + chance: 30, + onHit(target, source) { + const status = this.sample(['psn', 'par', 'slp']); + target.trySetStatus(status, source); + }, + }, + desc: "Has a 30% chance to cause the target to either fall asleep, become poisoned, or become paralyzed.", + shortDesc: "30% chance to sleep, poison, or paralyze target.", + }, + disarmingvoice: { + inherit: true, + isNonstandard: "Past", + }, + doodle: { + inherit: true, + isNonstandard: "Past", + }, + doomdesire: { + inherit: true, + isNonstandard: "Past", + }, + doublekick: { + inherit: true, + isNonstandard: "Past", + }, + doubleshock: { + inherit: true, + isNonstandard: "Custom", + }, + dragonascent: { + inherit: true, + isNonstandard: "Past", + }, + dragonbreath: { + inherit: true, + isNonstandard: "Past", + }, + dragoncheer: { + inherit: true, + flags: { bypasssub: 1, allyanim: 1, metronome: 1, sound: 1 }, + }, + dragonclaw: { + inherit: true, + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, slicing: 1 }, + }, + dragonenergy: { + inherit: true, + isNonstandard: "Past", + }, + dragonhammer: { + inherit: true, + basePower: 100, + isNonstandard: "Past", + }, + dreameater: { + inherit: true, + isNonstandard: "Past", + }, + drumbeating: { + inherit: true, + isNonstandard: "Past", + }, + dynamaxcannon: { + inherit: true, + isNonstandard: "Past", + }, + echoedvoice: { + inherit: true, + isNonstandard: "Past", + }, + electrify: { + inherit: true, + isNonstandard: null, + }, + electrodrift: { + inherit: true, + isNonstandard: "Past", + }, + ember: { + inherit: true, + isNonstandard: "Past", + }, + encore: { + inherit: true, + condition: { + inherit: true, + onStart(target) { + let move: Move | ActiveMove | null = target.lastMove; + if (!move || target.volatiles['dynamax']) return false; + + // Encore only works on Max Moves if the base move is not itself a Max Move + if (move.isMax && move.baseMove) move = this.dex.moves.get(move.baseMove); + const moveSlot = target.getMoveData(move.id); + if (move.isZ || move.isMax || move.flags['failencore'] || !moveSlot || moveSlot.pp <= 0) { + // it failed + return false; + } + this.effectState.move = move.id; + this.add('-start', target, 'Encore'); + const action = this.queue.willMove(target); + if (!action) { + this.effectState.duration!++; + // TODO: this is a quick fix, check if move priority is changed when Mental Herb cures Encore + } else if (!target.hasItem('mentalherb')) { + this.queue.changeAction(target, { + choice: 'move', + // target: undefined, + // targetLoc: undefined, + moveid: move.id, + order: action.order, // TODO: check Quash + Encore interaction + }); + } + }, + }, + }, + esperwing: { + inherit: true, + isNonstandard: "Past", + }, + fairywind: { + inherit: true, + isNonstandard: "Past", + }, + falsesurrender: { + inherit: true, + isNonstandard: "Past", + }, + falseswipe: { + inherit: true, + isNonstandard: "Past", + }, + fierywrath: { + inherit: true, + isNonstandard: "Past", + }, + filletaway: { + inherit: true, + isNonstandard: "Past", + }, + firelash: { + inherit: true, + basePower: 90, + }, + firepledge: { + inherit: true, + isNonstandard: "Past", + }, + firstimpression: { + inherit: true, + basePower: 100, + }, + fishiousrend: { + inherit: true, + basePower: 80, + }, + flamewheel: { + inherit: true, + isNonstandard: "Past", + }, + fleurcannon: { + inherit: true, + isNonstandard: "Past", + }, + floralhealing: { + inherit: true, + isNonstandard: "Past", + }, + forcepalm: { + inherit: true, + isNonstandard: "Past", + }, + freezeshock: { + inherit: true, + isNonstandard: "Past", + }, + freezingglare: { + inherit: true, + isNonstandard: "Past", + }, + furyattack: { + inherit: true, + isNonstandard: "Past", + }, + furycutter: { + inherit: true, + isNonstandard: "Past", + }, + furyswipes: { + inherit: true, + isNonstandard: "Past", + }, + fusionbolt: { + inherit: true, + isNonstandard: "Past", + }, + fusionflare: { + inherit: true, + isNonstandard: "Past", + }, + geargrind: { + inherit: true, + accuracy: 90, + basePower: 60, + }, + glaciallance: { + inherit: true, + isNonstandard: "Past", + }, + glaciate: { + inherit: true, + isNonstandard: "Past", + }, + glaiverush: { + inherit: true, + isNonstandard: "Past", + }, + grasspledge: { + inherit: true, + isNonstandard: "Past", + }, + gravapple: { + inherit: true, + basePower: 90, + }, + growl: { + inherit: true, + isNonstandard: "Past", + }, + growth: { + inherit: true, + type: "Grass", + }, + gust: { + inherit: true, + isNonstandard: "Past", + }, + happyhour: { + inherit: true, + isNonstandard: "Past", + }, + harden: { + inherit: true, + isNonstandard: "Past", + }, + headbutt: { + inherit: true, + isNonstandard: "Past", + }, + heartswap: { + inherit: true, + isNonstandard: "Past", + }, + holdback: { + inherit: true, + isNonstandard: "Past", + }, + holdhands: { + inherit: true, + isNonstandard: "Past", + }, + honeclaws: { + inherit: true, + isNonstandard: "Past", + }, + hornattack: { + inherit: true, + isNonstandard: "Past", + }, + hydrosteam: { + inherit: true, + isNonstandard: "Past", + }, + hyperdrill: { + inherit: true, + basePower: 120, + isNonstandard: "Past", + }, + hyperspacefury: { + inherit: true, + isNonstandard: "Past", + }, + hyperspacehole: { + inherit: true, + isNonstandard: "Past", + }, + iceburn: { + inherit: true, + isNonstandard: "Past", + }, + incinerate: { + inherit: true, + isNonstandard: "Past", + }, + infernalparade: { + inherit: true, + basePower: 65, + }, + ironhead: { + inherit: true, + secondary: { + chance: 20, + volatileStatus: 'flinch', + }, + desc: "Has a 20% chance to make the target flinch.", + shortDesc: "20% chance to make the target flinch.", + }, + ivycudgel: { + inherit: true, + isNonstandard: "Past", + }, + jawlock: { + inherit: true, + isNonstandard: "Past", + }, + judgment: { + inherit: true, + isNonstandard: "Past", + }, + junglehealing: { + inherit: true, + isNonstandard: "Past", + }, + kingsshield: { + inherit: true, + isNonstandard: null, + pp: 5, + }, + leafage: { + inherit: true, + isNonstandard: "Past", + }, + leer: { + inherit: true, + isNonstandard: "Past", + }, + lick: { + inherit: true, + isNonstandard: "Past", + }, + lightofruin: { + inherit: true, + isNonstandard: null, + }, + lunarblessing: { + inherit: true, + isNonstandard: "Past", + }, + lunardance: { + inherit: true, + isNonstandard: "Past", + }, + lusterpurge: { + inherit: true, + isNonstandard: "Past", + }, + magicalleaf: { + inherit: true, + isNonstandard: "Past", + }, + magicaltorque: { + inherit: true, + isNonstandard: "Past", + }, + magmastorm: { + inherit: true, + isNonstandard: "Past", + }, + makeitrain: { + inherit: true, + accuracy: 95, + isNonstandard: "Past", + }, + malignantchain: { + inherit: true, + isNonstandard: "Past", + }, + megadrain: { + inherit: true, + isNonstandard: "Past", + }, + megapunch: { + inherit: true, + isNonstandard: "Past", + }, + metalclaw: { + inherit: true, + isNonstandard: "Past", + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, slicing: 1 }, + }, + metronome: { + inherit: true, + isNonstandard: "Past", + }, + mightycleave: { + inherit: true, + isNonstandard: "Past", + }, + mimic: { + inherit: true, + isNonstandard: "Past", + }, + mist: { + inherit: true, + isNonstandard: "Past", + }, + mistball: { + inherit: true, + isNonstandard: "Past", + }, + moonblast: { + inherit: true, + secondary: { + chance: 10, + boosts: { + spa: -1, + }, + }, + desc: "Has a 10% chance to lower the target's Special Attack by 1 stage.", + shortDesc: "10% chance to lower the target's Sp. Atk by 1.", + }, + moongeistbeam: { + inherit: true, + isNonstandard: "Past", + }, + mountaingale: { + inherit: true, + basePower: 120, + }, + mysticalpower: { + inherit: true, + isNonstandard: "Past", + }, + nightdaze: { + inherit: true, + basePower: 90, + }, + nightslash: { + inherit: true, + pp: 20, + }, + nihillight: { + inherit: true, + pp: 5, + }, + noretreat: { + inherit: true, + isNonstandard: "Past", + }, + noxioustorque: { + inherit: true, + isNonstandard: "Past", + }, + obstruct: { + inherit: true, + pp: 5, + }, + orderup: { + inherit: true, + isNonstandard: "Past", + }, + originpulse: { + inherit: true, + isNonstandard: "Past", + }, + overdrive: { + inherit: true, + isNonstandard: "Past", + }, + payday: { + inherit: true, + isNonstandard: "Past", + }, + peck: { + inherit: true, + isNonstandard: "Past", + }, + photongeyser: { + inherit: true, + isNonstandard: "Past", + }, + playnice: { + inherit: true, + isNonstandard: "Past", + }, + poisongas: { + inherit: true, + isNonstandard: "Past", + }, + poisonsting: { + inherit: true, + isNonstandard: "Past", + }, + poisontail: { + inherit: true, + isNonstandard: "Past", + }, + powdersnow: { + inherit: true, + isNonstandard: "Past", + }, + powershift: { + inherit: true, + isNonstandard: null, + }, + precipiceblades: { + inherit: true, + isNonstandard: "Past", + }, + present: { + inherit: true, + isNonstandard: "Past", + }, + prismaticlaser: { + inherit: true, + isNonstandard: "Past", + }, + protect: { + inherit: true, + pp: 5, + }, + psybeam: { + inherit: true, + isNonstandard: "Past", + }, + psyblade: { + inherit: true, + isNonstandard: "Past", + }, + psychoboost: { + inherit: true, + isNonstandard: "Past", + }, + psyshieldbash: { + inherit: true, + basePower: 90, + }, + psystrike: { + inherit: true, + isNonstandard: "Past", + }, + purify: { + inherit: true, + pp: 5, + }, + pyroball: { + inherit: true, + isNonstandard: "Past", + }, + ragefist: { + inherit: true, + isNonstandard: "Past", + }, + // ragepowder: { + // inherit: true, + // flags: { noassist: 1, failcopycat: 1 }, + // }, + razorleaf: { + inherit: true, + isNonstandard: "Past", + }, + relicsong: { + inherit: true, + isNonstandard: "Past", + }, + retaliate: { + inherit: true, + isNonstandard: "Past", + }, + revelationdance: { + inherit: true, + basePower: 100, + isNonstandard: "Past", + }, + revivalblessing: { + inherit: true, + isNonstandard: "Custom", + }, + roaroftime: { + inherit: true, + isNonstandard: "Past", + }, + rocksmash: { + inherit: true, + isNonstandard: "Past", + }, + rockthrow: { + inherit: true, + isNonstandard: "Past", + }, + rollout: { + inherit: true, + isNonstandard: "Past", + }, + ruination: { + inherit: true, + isNonstandard: "Past", + }, + sacredfire: { + inherit: true, + isNonstandard: "Past", + }, + saltcure: { + inherit: true, + condition: { + inherit: true, + onResidual(pokemon) { + this.damage(pokemon.baseMaxhp / (pokemon.hasType(['Water', 'Steel']) ? 8 : 16)); + }, + }, + desc: "Causes damage to the target equal to 1/16 of its maximum HP (1/8 if the target is Steel or Water type), rounded down, at the end of each turn during effect. This effect ends when the target is no longer active.", + shortDesc: "Deals 1/16 max HP each turn; 1/8 on Steel, Water.", + }, + sandattack: { + inherit: true, + isNonstandard: "Past", + }, + sandsearstorm: { + inherit: true, + isNonstandard: "Past", + }, + sandstorm: { + inherit: true, + pp: 5, + }, + scratch: { + inherit: true, + isNonstandard: "Past", + }, + secretsword: { + inherit: true, + isNonstandard: "Past", + }, + seedflare: { + inherit: true, + isNonstandard: "Past", + }, + shadowclaw: { + inherit: true, + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, slicing: 1 }, + }, + shadowforce: { + inherit: true, + isNonstandard: "Past", + }, + shelltrap: { + inherit: true, + pp: 10, + }, + shiftgear: { + inherit: true, + isNonstandard: "Past", + }, + shockwave: { + inherit: true, + isNonstandard: "Past", + }, + shoreup: { + inherit: true, + isNonstandard: "Past", + }, + silktrap: { + inherit: true, + isNonstandard: "Past", + }, + sketch: { + inherit: true, + isNonstandard: "Past", + }, + slam: { + inherit: true, + isNonstandard: "Past", + }, + slash: { + inherit: true, + isNonstandard: "Past", + }, + sludge: { + inherit: true, + isNonstandard: "Past", + }, + smog: { + inherit: true, + isNonstandard: "Past", + }, + smokescreen: { + inherit: true, + isNonstandard: "Past", + }, + snaptrap: { + inherit: true, + isNonstandard: null, + type: "Steel", + }, + snipeshot: { + inherit: true, + basePower: 85, + isNonstandard: "Past", + }, + snowscape: { + inherit: true, + pp: 5, + }, + spacialrend: { + inherit: true, + isNonstandard: "Past", + }, + spark: { + inherit: true, + isNonstandard: "Past", + }, + spikyshield: { + inherit: true, + pp: 5, + }, + spinout: { + inherit: true, + isNonstandard: "Past", + pp: 10, + }, + spiritbreak: { + inherit: true, + isNonstandard: "Past", + }, + spiritshackle: { + inherit: true, + basePower: 90, + }, + splash: { + inherit: true, + isNonstandard: "Past", + }, + springtidestorm: { + inherit: true, + isNonstandard: "Past", + }, + steameruption: { + inherit: true, + isNonstandard: "Past", + }, + stomp: { + inherit: true, + isNonstandard: "Past", + }, + stormthrow: { + inherit: true, + isNonstandard: null, + }, + strangesteam: { + inherit: true, + isNonstandard: "Past", + }, + strength: { + inherit: true, + isNonstandard: "Past", + }, + sunsteelstrike: { + inherit: true, + isNonstandard: "Past", + }, + supersonic: { + inherit: true, + isNonstandard: "Past", + }, + surgingstrikes: { + inherit: true, + isNonstandard: "Past", + }, + swift: { + inherit: true, + isNonstandard: "Past", + }, + syrupbomb: { + inherit: true, + accuracy: 90, + }, + tachyoncutter: { + inherit: true, + isNonstandard: "Past", + }, + tackle: { + inherit: true, + isNonstandard: "Past", + }, + tailglow: { + inherit: true, + isNonstandard: "Past", + }, + tailwhip: { + inherit: true, + isNonstandard: "Past", + }, + takedown: { + inherit: true, + isNonstandard: "Past", + }, + takeheart: { + inherit: true, + isNonstandard: "Past", + }, + tarshot: { + inherit: true, + isNonstandard: "Past", + }, + teleport: { + inherit: true, + isNonstandard: "Past", + }, + terablast: { + inherit: true, + isNonstandard: "Past", + }, + terastarstorm: { + inherit: true, + isNonstandard: "Past", + }, + thundercage: { + inherit: true, + isNonstandard: "Past", + }, + thunderclap: { + inherit: true, + isNonstandard: "Past", + }, + thunderouskick: { + inherit: true, + isNonstandard: "Past", + }, + thundershock: { + inherit: true, + isNonstandard: "Past", + }, + topsyturvy: { + inherit: true, + isNonstandard: "Past", + }, + toxicthread: { + inherit: true, + boosts: { + spe: -2, + }, + desc: "Lowers the target's Speed by 2 stages and poisons it.", + shortDesc: "Lowers the target's Speed by 2 and poisons it.", + }, + trickortreat: { + inherit: true, + isNonstandard: null, + }, + tripledive: { + inherit: true, + basePower: 35, + isNonstandard: "Past", + }, + triplekick: { + inherit: true, + isNonstandard: "Past", + }, + tropkick: { + inherit: true, + basePower: 85, + }, + twister: { + inherit: true, + isNonstandard: "Past", + }, + vcreate: { + inherit: true, + isNonstandard: "Past", + }, + victorydance: { + inherit: true, + isNonstandard: "Past", + }, + vinewhip: { + inherit: true, + isNonstandard: "Past", + }, + visegrip: { + inherit: true, + isNonstandard: "Past", + }, + watergun: { + inherit: true, + isNonstandard: "Past", + }, + waterpledge: { + inherit: true, + isNonstandard: "Past", + }, + wickedblow: { + inherit: true, + isNonstandard: "Past", + }, + wickedtorque: { + inherit: true, + isNonstandard: "Past", + }, + wildboltstorm: { + inherit: true, + isNonstandard: "Past", + }, + wingattack: { + inherit: true, + isNonstandard: "Past", + }, + withdraw: { + inherit: true, + isNonstandard: "Past", + }, + workup: { + inherit: true, + isNonstandard: "Past", + }, + zingzap: { + inherit: true, + isNonstandard: "Past", + }, +}; diff --git a/data/mods/champions/rulesets.ts b/data/mods/champions/rulesets.ts new file mode 100644 index 0000000000..bf0bebe716 --- /dev/null +++ b/data/mods/champions/rulesets.ts @@ -0,0 +1,40 @@ +export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { + standardag: { + inherit: true, + ruleset: [ + 'Obtainable', 'Team Preview', 'Cancel Mod', 'Endless Battle Clause', + 'Adjust Level = 50', 'Species Clause', 'Item Clause = 1', + ], + onBegin() { + this.reportPercentages = true; + }, + }, + standard: { + inherit: true, + ruleset: [ + 'Standard AG', + 'Sleep Moves Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', + ], + }, + standarddraft: { + inherit: true, + ruleset: [ + 'Standard AG', + 'Nickname Clause', 'Beat Up Nicknames Mod', 'Sleep Clause Mod', 'OHKO Clause', 'Evasion Clause', + '!Item Clause', + ], + onBegin() { + this.reportPercentages = true; + }, + // timer: {starting: 60 * 60, grace: 0, addPerTurn: 10, maxPerTurn: 100, timeoutAutoChoose: true}, + }, + flatrules: { + inherit: true, + desc: "The in-game Flat Rules: Adjust Level 50, Species Clause, Item Clause = 1, -Mythical, -Restricted Legendary, Bring 6 Pick 3-6 depending on game type.", + ruleset: ['Obtainable', 'Team Preview', 'Species Clause', 'Nickname Clause', 'Item Clause = 1', 'Adjust Level = 50', 'Picked Team Size = Auto', 'Cancel Mod'], + banlist: ['Mythical', 'Restricted Legendary'], + onBegin() { + this.reportPercentages = true; + }, + }, +}; diff --git a/data/mods/champions/scripts.ts b/data/mods/champions/scripts.ts new file mode 100644 index 0000000000..7989407636 --- /dev/null +++ b/data/mods/champions/scripts.ts @@ -0,0 +1,505 @@ +export const Scripts: ModdedBattleScriptsData = { + gen: 9, + init() { + for (const i in this.data.Moves) { + if (this.data.Moves[i].pp > 20) { + this.modData('Moves', i).pp = 20; + } + } + }, + statModify(baseStats, set, statName) { + const tr = this.trunc; + let stat = baseStats[statName]; + const evs = set.evs[statName]; + if (statName === 'hp') { + return stat + evs + 75; + } + stat = stat + evs + 20; + const nature = this.dex.natures.get(set.nature); + // Natures are calculated with 16-bit truncation. + // This only affects Eternatus-Eternamax in Pure Hackmons. + if (nature.plus === statName) { + stat = this.ruleTable.has('overflowstatmod') ? Math.min(stat, 595) : stat; + stat = tr(tr(stat * 110, 16) / 100); + } else if (nature.minus === statName) { + stat = this.ruleTable.has('overflowstatmod') ? Math.min(stat, 728) : stat; + stat = tr(tr(stat * 90, 16) / 100); + } + return stat; + }, + calculatePP(move, ppUps) { + return move.noPPBoosts ? move.pp : (move.pp / 5 + 1) * 4; + }, + pokemon: { + // Remove Trick Room underflow + getActionSpeed() { + let speed = this.getStat('spe', false, false); + const trickRoomCheck = this.battle.ruleTable.has('twisteddimensionmod') ? + !this.battle.field.getPseudoWeather('trickroom') : this.battle.field.getPseudoWeather('trickroom'); + if (trickRoomCheck) { + speed = -speed; + } + return speed; + }, + // Don't revert Mega Evolutions after fainting + // TODO: confirm interaction with Revival Blessing + formeChange(speciesId, source, isPermanent, abilitySlot = '0', message) { + const rawSpecies = this.battle.dex.species.get(speciesId); + + const species = this.setSpecies(rawSpecies, source); + if (!species) return false; + + if (this.battle.gen <= 2) return true; + + // The species the opponent sees + const apparentSpecies = + this.illusion ? this.illusion.species.name : species.baseSpecies; + if (isPermanent) { + this.baseSpecies = rawSpecies; + this.details = this.getUpdatedDetails(); + let details = (this.illusion || this).details; + if (this.terastallized) details += `, tera:${this.terastallized}`; + this.battle.add('detailschange', this, details); + this.updateMaxHp(); + if (!source) { + // Tera forme + // Ogerpon/Terapagos text goes here + this.formeRegression = true; + } else if (source.effectType === 'Item') { + this.canTerastallize = null; // National Dex behavior + if (source.zMove) { + this.battle.add('-burst', this, apparentSpecies, species.requiredItem); + this.moveThisTurnResult = true; // Ultra Burst counts as an action for Truant + } else if (source.isPrimalOrb) { + if (this.illusion) { + this.ability = ''; + this.battle.add('-primal', this.illusion, species.requiredItem); + } else { + this.battle.add('-primal', this, species.requiredItem); + } + } else { + this.battle.add('-mega', this, apparentSpecies, species.requiredItem); + this.moveThisTurnResult = true; // Mega Evolution counts as an action for Truant + } + } else if (source.effectType === 'Status') { + // Shaymin-Sky -> Shaymin + this.battle.add('-formechange', this, species.name, message); + } + } else { + if (source?.effectType === 'Ability') { + this.battle.add('-formechange', this, species.name, message, `[from] ability: ${source.name}`); + } else { + this.battle.add('-formechange', this, this.illusion ? this.illusion.species.name : species.name, message); + } + } + if (isPermanent && (!source || !['disguise', 'iceface'].includes(source.id))) { + if (this.illusion && source) { + // Tera forme by Ogerpon or Terapagos breaks the Illusion + this.ability = ''; // Don't allow Illusion to wear off + } + const ability = species.abilities[abilitySlot] || species.abilities['0']; + // Ogerpon's forme change doesn't override permanent abilities + if (source || !this.getAbility().flags['cantsuppress']) this.setAbility(ability, null, null, true); + // However, its ability does reset upon switching out + this.baseAbility = this.battle.toID(ability); + } + if (this.terastallized) { + this.knownType = true; + this.apparentType = this.terastallized; + } + return true; + }, + // Announce status immunities from abilities without revealing the ability + // TODO: check if this happens to other abilities besides Spicy Spray (Static, Poison Touch, etc.) + setStatus(status, source, sourceEffect, ignoreImmunities) { + if (!this.hp) return false; + status = this.battle.dex.conditions.get(status); + if (this.battle.event) { + if (!source) source = this.battle.event.source; + if (!sourceEffect) sourceEffect = this.battle.effect; + } + if (!source) source = this; + + if (this.status === status.id) { + if ((sourceEffect as Move)?.status === this.status) { + this.battle.add('-fail', this, this.status); + } else if ((sourceEffect as Move)?.status) { + this.battle.add('-fail', source); + this.battle.attrLastMove('[still]'); + } + return false; + } + + if ( + !ignoreImmunities && status.id && !(source?.hasAbility('corrosion') && ['tox', 'psn'].includes(status.id)) + ) { + // the game currently never ignores immunities + if (!this.runStatusImmunity(status.id === 'tox' ? 'psn' : status.id)) { + this.battle.debug('immune to status'); + if ((sourceEffect as Move)?.status || sourceEffect?.effectType === 'Ability') { + this.battle.add('-immune', this); + } + return false; + } + } + const prevStatus = this.status; + const prevStatusState = this.statusState; + if (status.id) { + const result: boolean = this.battle.runEvent('SetStatus', this, source, sourceEffect, status); + if (!result) { + this.battle.debug('set status [' + status.id + '] interrupted'); + return result; + } + } + + this.status = status.id; + this.statusState = this.battle.initEffectState({ id: status.id, target: this }); + if (source) this.statusState.source = source; + if (status.duration) this.statusState.duration = status.duration; + if (status.durationCallback) { + this.statusState.duration = status.durationCallback.call(this.battle, this, source, sourceEffect); + } + + if (status.id && !this.battle.singleEvent('Start', status, this.statusState, this, source, sourceEffect)) { + this.battle.debug('status start [' + status.id + '] interrupted'); + // cancel the setstatus + this.status = prevStatus; + this.statusState = prevStatusState; + return false; + } + if (status.id && !this.battle.runEvent('AfterSetStatus', this, source, sourceEffect, status)) { + return false; + } + return true; + }, + // Disable Fake Out if the user has already acted since switching in + getMoves(lockedMove, restrictData) { + if (lockedMove) { + lockedMove = this.battle.toID(lockedMove); + if (lockedMove === 'recharge') { + return [{ + move: 'Recharge', + id: 'recharge' as ID, + }]; + } + for (const moveSlot of this.moveSlots) { + if (moveSlot.id !== lockedMove) continue; + return [{ + move: moveSlot.move, + id: moveSlot.id, + }]; + } + // does this happen? + return [{ + move: this.battle.dex.moves.get(lockedMove).name, + id: lockedMove, + }]; + } + const moves = []; + let hasValidMove = false; + for (const moveSlot of this.moveSlots) { + let moveName = moveSlot.move; + if (moveSlot.id === 'hiddenpower') { + moveName = `Hidden Power ${this.hpType}`; + if (this.battle.gen < 6) moveName += ` ${this.hpPower}`; + } else if (moveSlot.id === 'return' || moveSlot.id === 'frustration') { + const basePowerCallback = this.battle.dex.moves.get(moveSlot.id).basePowerCallback as (pokemon: Pokemon) => number; + moveName += ` ${basePowerCallback(this)}`; + } + let target = moveSlot.target; + switch (moveSlot.id) { + case 'curse': + if (!this.hasType('Ghost')) { + target = this.battle.dex.moves.get('curse').nonGhostTarget; + } + break; + case 'pollenpuff': + // Heal Block only prevents Pollen Puff from targeting an ally when the user has Heal Block + if (this.volatiles['healblock']) { + target = 'adjacentFoe'; + } + break; + case 'terastarstorm': + if (this.species.name === 'Terapagos-Stellar') { + target = 'allAdjacentFoes'; + } + break; + } + let disabled = moveSlot.disabled; + if (this.volatiles['dynamax']) { + // if each of a Pokemon's base moves are disabled by one of these effects, it will Struggle + const canCauseStruggle = ['Encore', 'Disable', 'Taunt', 'Assault Vest', 'Belch', 'Stuff Cheeks']; + disabled = this.maxMoveDisabled(moveSlot.id) || disabled && canCauseStruggle.includes(moveSlot.disabledSource!); + } else if (moveSlot.pp <= 0 || (moveSlot.id === 'fakeout' && this.activeMoveActions > 0)) { + disabled = true; + } + + if (disabled === 'hidden') { + disabled = !restrictData; + } + if (!disabled) { + hasValidMove = true; + } + + moves.push({ + move: moveName, + id: moveSlot.id, + pp: moveSlot.pp, + maxpp: moveSlot.maxpp, + target, + disabled, + }); + } + return hasValidMove ? moves : []; + }, + }, + actions: { + canTerastallize(pokemon) { + return null; + }, + canMegaEvo(pokemon: Pokemon) { + const species = pokemon.baseSpecies; + const altForme = species.otherFormes && this.dex.species.get(species.otherFormes[0]); + const item = pokemon.getItem(); + // Mega Rayquaza + if ((this.battle.gen <= 7 || this.battle.ruleTable.has('+pokemontag:past') || + this.battle.ruleTable.has('+pokemontag:future')) && + altForme?.isMega && altForme?.requiredMove && + pokemon.baseMoves.includes(toID(altForme.requiredMove)) && !item.zMove) { + return altForme.name; + } + return item.megaStone?.[species.name] || null; + }, + // Announce 4x and 0.25x effectiveness + modifyDamage(baseDamage, pokemon, target, move, suppressMessages) { + const tr = this.battle.trunc; + if (!move.type) move.type = '???'; + const type = move.type; + + baseDamage += 2; + + if (move.spreadHit) { + // multi-target modifier (doubles only) + const spreadModifier = this.battle.gameType === 'freeforall' ? 0.5 : 0.75; + this.battle.debug(`Spread modifier: ${spreadModifier}`); + baseDamage = this.battle.modify(baseDamage, spreadModifier); + } else if (move.multihitType === 'parentalbond' && move.hit > 1) { + // Parental Bond modifier + const bondModifier = this.battle.gen > 6 ? 0.25 : 0.5; + this.battle.debug(`Parental Bond modifier: ${bondModifier}`); + baseDamage = this.battle.modify(baseDamage, bondModifier); + } + + // weather modifier + baseDamage = this.battle.runEvent('WeatherModifyDamage', pokemon, target, move, baseDamage); + + // crit - not a modifier + const isCrit = target.getMoveHitData(move).crit; + if (isCrit) { + baseDamage = tr(baseDamage * (move.critModifier || (this.battle.gen >= 6 ? 1.5 : 2))); + } + + // random factor - also not a modifier + baseDamage = this.battle.randomizer(baseDamage); + + // STAB + // The "???" type never gets STAB + // Not even if you Roost in Gen 4 and somehow manage to use + // Struggle in the same turn. + // (On second thought, it might be easier to get a MissingNo.) + if (type !== '???') { + let stab: number | [number, number] = 1; + + const isSTAB = move.forceSTAB || pokemon.hasType(type) || pokemon.getTypes(false, true).includes(type); + if (isSTAB) { + stab = 1.5; + } + + // The Stellar tera type makes this incredibly confusing + // If the move's type does not match one of the user's base types, + // the Stellar tera type applies a one-time 1.2x damage boost for that type. + // + // If the move's type does match one of the user's base types, + // then the Stellar tera type applies a one-time 2x STAB boost for that type, + // and then goes back to using the regular 1.5x STAB boost for those types. + if (pokemon.terastallized === 'Stellar') { + if (!pokemon.stellarBoostedTypes.includes(type) || move.stellarBoosted) { + stab = isSTAB ? 2 : [4915, 4096]; + move.stellarBoosted = true; + if (pokemon.species.name !== 'Terapagos-Stellar') { + pokemon.stellarBoostedTypes.push(type); + } + } + } else { + if (pokemon.terastallized === type && pokemon.getTypes(false, true).includes(type)) { + stab = 2; + } + stab = this.battle.runEvent('ModifySTAB', pokemon, target, move, stab); + } + + baseDamage = this.battle.modify(baseDamage, stab); + } + + // types + let typeMod = target.runEffectiveness(move); + typeMod = this.battle.clampIntRange(typeMod, -6, 6); + target.getMoveHitData(move).typeMod = typeMod; + if (typeMod > 0) { + if (!suppressMessages) this.battle.add('-supereffective', target, Math.min(typeMod, 2)); + + for (let i = 0; i < typeMod; i++) { + baseDamage *= 2; + } + } + if (typeMod < 0) { + if (!suppressMessages) this.battle.add('-resisted', target, Math.min(-typeMod, 2)); + + for (let i = 0; i > typeMod; i--) { + baseDamage = tr(baseDamage / 2); + } + } + + if (isCrit && !suppressMessages) this.battle.add('-crit', target); + + if (pokemon.status === 'brn' && move.category === 'Physical' && !pokemon.hasAbility('guts')) { + if (this.battle.gen < 6 || move.id !== 'facade') { + baseDamage = this.battle.modify(baseDamage, 0.5); + } + } + + // Generation 5, but nothing later, sets damage to 1 before the final damage modifiers + if (this.battle.gen === 5 && !baseDamage) baseDamage = 1; + + // Final modifier. Modifiers that modify damage after min damage check, such as Life Orb. + baseDamage = this.battle.runEvent('ModifyDamage', pokemon, target, move, baseDamage); + + const bypassProtect = target.getMoveHitData(move).bypassProtect; + if (bypassProtect) { + baseDamage = this.battle.modify(baseDamage, 0.25); + if (bypassProtect !== true && bypassProtect.effectType === 'Ability') { + this.battle.add('-ability', pokemon, bypassProtect.name); + } + this.battle.add('-zbroken', target); + } + + // Generation 6-7 moves the check for minimum 1 damage after the final modifier... + if (this.battle.gen !== 5 && !baseDamage) return 1; + + // ...but 16-bit truncation happens even later, and can truncate to 0 + return tr(baseDamage, 16); + }, + // Run `AfterHit` events even if the source fainted + spreadMoveHit(targets, pokemon, moveOrMoveName, hitEffect?, isSecondary?, isSelf?) { + // Hardcoded for single-target purposes + // (no spread moves have any kind of onTryHit handler) + const target = targets[0]; + let damage: (number | boolean | undefined)[] = []; + for (const i of targets.keys()) { + damage[i] = true; + } + const move = this.dex.getActiveMove(moveOrMoveName); + let hitResult: boolean | number | null = true; + let moveData = hitEffect!; + if (!moveData) moveData = move; + if (!moveData.flags) moveData.flags = {}; + if (move.target === 'all' && !isSelf) { + hitResult = this.battle.singleEvent('TryHitField', moveData, {}, target || null, pokemon, move); + } else if ((move.target === 'foeSide' || move.target === 'allySide' || move.target === 'allyTeam') && !isSelf) { + hitResult = this.battle.singleEvent('TryHitSide', moveData, {}, target || null, pokemon, move); + } else if (target) { + hitResult = this.battle.singleEvent('TryHit', moveData, {}, target, pokemon, move); + } + if (!hitResult) { + if (hitResult === false) { + this.battle.add('-fail', pokemon); + this.battle.attrLastMove('[still]'); + } + return [[false], targets]; // single-target only + } + + // 0. check for substitute + if (!isSecondary && !isSelf) { + if (move.target !== 'all' && move.target !== 'allyTeam' && move.target !== 'allySide' && move.target !== 'foeSide') { + damage = this.tryPrimaryHitEvent(damage, targets, pokemon, move, moveData, isSecondary); + } + } + + for (const i of targets.keys()) { + if (damage[i] === this.battle.HIT_SUBSTITUTE) { + damage[i] = true; + targets[i] = null; + } + if (targets[i] && isSecondary && !moveData.self) { + damage[i] = true; + } + if (!damage[i]) targets[i] = false; + } + // 1. call to this.battle.getDamage + damage = this.getSpreadDamage(damage, targets, pokemon, move, moveData, isSecondary, isSelf); + + for (const i of targets.keys()) { + if (damage[i] === false) targets[i] = false; + } + + // 2. call to this.battle.spreadDamage + damage = this.battle.spreadDamage(damage, targets, pokemon, move); + + for (const i of targets.keys()) { + if (damage[i] === false) targets[i] = false; + } + + // 3. onHit event happens here + damage = this.runMoveEffects(damage, targets, pokemon, move, moveData, isSecondary, isSelf); + + for (const i of targets.keys()) { + if (!damage[i] && damage[i] !== 0) targets[i] = false; + } + + // steps 4 and 5 can mess with this.battle.activeTarget, which needs to be preserved for Dancer + const activeTarget = this.battle.activeTarget; + + // 4. self drops (start checking for targets[i] === false here) + if (moveData.self && !move.selfDropped) this.selfDrops(targets, pokemon, move, moveData, isSecondary); + + // 5. secondary effects + if (moveData.secondaries) this.secondaries(targets, pokemon, move, moveData, isSelf); + + this.battle.activeTarget = activeTarget; + + // 6. force switch + if (moveData.forceSwitch) damage = this.forceSwitch(damage, targets, pokemon, move); + + for (const i of targets.keys()) { + if (!damage[i] && damage[i] !== 0) targets[i] = false; + } + + const damagedTargets: Pokemon[] = []; + const damagedDamage = []; + for (const [i, t] of targets.entries()) { + if (typeof damage[i] === 'number' && t) { + damagedTargets.push(t); + damagedDamage.push(damage[i]); + } + } + const pokemonOriginalHP = pokemon.hp; + if (damagedDamage.length && !isSecondary && !isSelf) { + if (this.battle.gen >= 5) { + this.battle.runEvent('DamagingHit', damagedTargets, pokemon, move, damagedDamage); + } + if (moveData.onAfterHit) { + for (const t of damagedTargets) { + this.battle.singleEvent('AfterHit', moveData, {}, t, pokemon, move); + } + } + if (this.battle.gen < 5) { + this.battle.runEvent('DamagingHit', damagedTargets, pokemon, move, damagedDamage); + } + if (pokemon.hp && pokemon.hp <= pokemon.maxhp / 2 && pokemonOriginalHP > pokemon.maxhp / 2) { + this.battle.runEvent('EmergencyExit', pokemon); + } + } + + return [damage, targets]; + }, + }, +}; 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..c9817af1c2 100644 --- a/data/mods/chatbats/moves.ts +++ b/data/mods/chatbats/moves.ts @@ -2,7 +2,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { ancientpower: { inherit: true, category: "Physical", - secondary: null, + secondary: undefined, // no inherit // Ancient Power is physical and boosts on-kill onAfterMoveSecondarySelf(pokemon, target, move) { if (!target || target.fainted || target.hp <= 0) { @@ -44,7 +44,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-anim', source, 'Crunch', target); this.add('-anim', source, 'Rock Slide', target); }, - secondary: null, target: "normal", type: "Rock", contestType: "Clever", @@ -60,7 +59,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Poison", contestType: "Tough", @@ -197,7 +195,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.field.setWeather('snowscape'); }, }, - secondary: null, target: "normal", type: "Ice", contestType: "Clever", @@ -254,7 +251,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { onAfterSubDamage(damage, target, source, move) { if (!source.isAlly(target)) this.hint(move.category + " Geyser"); }, - secondary: null, target: "normal", type: "Water", desc: "This move is Special + no contact if it would be stronger.", @@ -281,7 +277,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { target.addVolatile('encore'); }, weather: 'raindance', - secondary: null, target: "normal", type: "Water", zMove: { boost: { spe: 1 } }, @@ -343,7 +338,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-anim', source, 'Ivy Cudgel Rock', target); this.add('-anim', source, 'Splash'); }, - secondary: null, target: "normal", type: "Rock", contestType: "Beautiful", @@ -366,7 +360,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { onPrepareHit(target, source, move) { this.add('-anim', source, 'Metal Claw', target); }, - secondary: null, target: "normal", type: "Steel", contestType: "Beautiful", @@ -395,7 +388,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, thunderouskick: { inherit: true, - secondary: null, + secondary: undefined, // no inherit onHit(target, source, move) { // random # 0 or 1 const randomNum = this.random(2); @@ -444,7 +437,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, }, - secondary: null, target: "foeSide", type: "Rock", zMove: { boost: { def: 1 } }, @@ -487,7 +479,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, }, - secondary: null, target: "foeSide", type: "Ground", zMove: { boost: { def: 1 } }, @@ -584,8 +575,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } source.switchFlag = true; }, - secondary: null, - hasSheerForce: true, + hasSheerForceBoost: true, target: "normal", type: "Dragon", desc: "Dondozo eats a mon on the user's team, KOing it. Dondozo then gains a stat boost depending on the eaten mon's highest stat: +3 Attack for Atk/SpA, +2 Def/+2 SpD for Def/SpD, and +3 Speed for Speed.", @@ -658,7 +648,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-anim', source, 'Spirit Shackle', target); }, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Ghost", contestType: "Clever", @@ -687,7 +676,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Fighting", contestType: "Clever", @@ -833,7 +821,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { return success; }, flags: { protect: 1, mirror: 1, metronome: 1, wind: 1 }, - secondary: null, target: "allAdjacentFoes", type: "Dragon", contestType: "Cool", @@ -853,7 +840,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-start', target, 'typechange', 'Steel'); }, flags: { protect: 1, mirror: 1, metronome: 1, bullet: 1 }, - secondary: null, target: "normal", type: "Steel", contestType: "Cool", @@ -890,7 +876,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-anim', source, 'Extreme Speed', target); this.add('-anim', source, 'Thunder', target); }, - secondary: null, + secondary: undefined, // no inherit desc: "Nearly always goes first.", shortDesc: "Nearly always goes first.", }, @@ -938,7 +924,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, selfSwitch: true, - secondary: null, target: "normal", type: "Fire", contestType: "Cute", @@ -1078,7 +1063,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Rock", contestType: "Tough", @@ -1122,10 +1106,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, onTryHitPriority: 3, onTryHit(target, source, move) { - if (!move.flags['protect'] || move.category === 'Status') { - if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true; - return; - } + if (this.checkMoveBypassesProtect(move, source, target, false)) return; if (move.smartTarget) { move.smartTarget = false; } else { @@ -1174,7 +1155,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, drain: [1, 2], - secondary: null, target: "normal", type: "Fire", zMove: { basePower: 160 }, @@ -1209,7 +1189,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Grass", contestType: "Tough", @@ -1275,7 +1254,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, }, - secondary: null, target: "self", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -1311,10 +1289,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, { }); @@ -1323,7 +1297,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, flags: { protect: 1, mirror: 1, metronome: 1 }, multihit: [10, 10], - secondary: null, target: "normal", type: "Dark", zMove: { basePower: 140 }, @@ -1372,7 +1345,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { return null; }, callsMove: true, - secondary: null, target: "normal", type: "Normal", contestType: "Beautiful", @@ -1399,7 +1371,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { return priority + 1; } }, - secondary: null, target: "normal", type: "Fairy", contestType: "Cool", @@ -1426,7 +1397,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { return priority + 1; } }, - secondary: null, target: "normal", type: "Electric", contestType: "Cool", @@ -1454,7 +1424,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.boost({ spe: 1 }, source, source); } }, - secondary: null, target: "normal", type: "Psychic", contestType: "Cool", @@ -1532,16 +1501,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() { @@ -1631,10 +1590,10 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-anim', source, 'Explosion', target); this.add('-anim', source, 'Mind Blown', target); }, - secondary: null, target: "normal", type: "Normal", contestType: "Cute", + shortDesc: "Present but better.", }, sinisterarrows: { num: -1016, @@ -1708,13 +1667,56 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, }, - secondary: null, 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); + }, + 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/gen1/conditions.ts b/data/mods/gen1/conditions.ts index c62ee6e2ed..ea7d52cfe5 100644 --- a/data/mods/gen1/conditions.ts +++ b/data/mods/gen1/conditions.ts @@ -80,6 +80,9 @@ export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDa onAfterMoveSelf(pokemon) { if (pokemon.statusState.time <= 0) pokemon.cureStatus(); }, + onDisableMove(target) { + target.maybeLocked = false; // the player knows it is locked + }, }, frz: { name: 'frz', @@ -98,6 +101,9 @@ export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDa target.cureStatus(); } }, + onDisableMove(target) { + target.maybeLocked = false; // the player knows it is locked + }, }, psn: { name: 'psn', @@ -202,12 +208,11 @@ export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDa onAccuracy(accuracy, target, source, move) { if (source === this.effectState.source) return true; }, - onLockMove() { - // exact move doesn't matter, no move is ever actually used - return 'struggle'; - }, + onDisableMovePriority: 1, // higher priority so it gets undone by frz, slp or Bide onDisableMove(target) { - target.maybeLocked = true; + if (this.effectState.maybeLocked) { + target.maybeLocked = true; + } }, }, fakepartiallytrapped: { @@ -215,6 +220,7 @@ export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDa // Wrap ended this turn, but you don't know that // until you try to use an attack duration: 2, + onDisableMovePriority: 1, // higher priority so it gets undone by frz, slp or Bide onDisableMove(target) { target.maybeLocked = true; }, @@ -234,9 +240,6 @@ export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDa this.effectState.locked = foe; foe.addVolatile('partiallytrapped', target, effect); }, - onOverrideAction(pokemon, target, move) { - return this.effectState.move; - }, onBeforeMove(pokemon, target, move) { if (target !== this.effectState.locked) { pokemon.removeVolatile('partialtrappinglock'); @@ -256,20 +259,25 @@ export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDa } } else { target.addVolatile('partiallytrapped', pokemon, move); + if (this.effectState.totalDuration - this.effectState.duration! > 0) { + target.volatiles['partiallytrapped'].maybeLocked = true; + } } }, - onLockMove() { + onSemiLockMove() { return this.effectState.move; }, onDisableMove(pokemon) { - pokemon.maybeLocked = true; + if (this.effectState.totalDuration - this.effectState.duration! > 1) { + pokemon.maybeLocked = true; + } }, }, mustrecharge: { inherit: true, duration: 0, onBeforeMovePriority: 7, - onStart() {}, + onStart: undefined, // no inherit onAfterMove(pokemon, target, move) { if (target && target.hp <= 0) { delete pokemon.volatiles['mustrecharge']; diff --git a/data/mods/gen1/moves.ts b/data/mods/gen1/moves.ts index ba21a2506c..9bb9510f3f 100644 --- a/data/mods/gen1/moves.ts +++ b/data/mods/gen1/moves.ts @@ -32,7 +32,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, bide: { inherit: true, - priority: 0, accuracy: true, condition: { onStart(pokemon) { @@ -60,15 +59,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-activate', pokemon, 'Bide'); return false; }, - onDisableMove(pokemon) { - if (!pokemon.hasMove('bide')) { - return; - } - for (const moveSlot of pokemon.moveSlots) { - if (moveSlot.id !== 'bide') { - pokemon.disableMove(moveSlot.id); - } - } + onSemiLockMove: 'bide', + onDisableMove(target) { + target.maybeLocked = false; // the player knows it is locked }, }, type: "???", // Will look as Normal but it's STAB-less @@ -162,14 +155,14 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { // - if Counter is used by the opponent, it will succeed if the player's last selected move is Counterable // - (Counter will thus desync if the target's last used move is not as counterable as the target's last selected move) // - if Counter succeeds it will deal twice the last move damage dealt in battle (even if it's from a different pokemon because of a switch) + const isCounterable = (move: Move | null) => move && move.basePower > 0 && + ['Normal', 'Fighting'].includes(move.type) && move.id !== 'counter'; const lastMove = target.side.lastMove && this.dex.moves.get(target.side.lastMove.id); - const lastMoveIsCounterable = lastMove && lastMove.basePower > 0 && - ['Normal', 'Fighting'].includes(lastMove.type) && lastMove.id !== 'counter'; + const lastMoveIsCounterable = isCounterable(lastMove); const lastSelectedMove = target.side.lastSelectedMove && this.dex.moves.get(target.side.lastSelectedMove); - const lastSelectedMoveIsCounterable = lastSelectedMove && lastSelectedMove.basePower > 0 && - ['Normal', 'Fighting'].includes(lastSelectedMove.type) && lastSelectedMove.id !== 'counter'; + const lastSelectedMoveIsCounterable = isCounterable(lastSelectedMove || null); if (!lastMoveIsCounterable && !lastSelectedMoveIsCounterable) { this.debug("Gen 1 Counter: last move was not Counterable"); @@ -211,33 +204,23 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, }, disable: { - num: 50, - accuracy: 55, - basePower: 0, - category: "Status", - name: "Disable", - pp: 20, - priority: 0, - flags: { protect: 1, mirror: 1, bypasssub: 1, metronome: 1 }, - volatileStatus: 'disable', + inherit: true, onTryHit(target) { - // This function should not return if the checks are met. Adding && undefined ensures this happens. - return target.moveSlots.some(ms => ms.pp > 0) && - !('disable' in target.volatiles) && - undefined; + return target.moveSlots.some(ms => ms.pp > 0); }, condition: { + inherit: true, + durationCallback: undefined, // no inherit onStart(pokemon) { // disable can only select moves that have pp > 0, hence the onTryHit modification - const moveSlot = this.sample(pokemon.moveSlots.filter(ms => ms.pp > 0)); + const [slotIndex, moveSlot] = this.sample(Array.from(pokemon.moveSlots.entries()).filter(([i, ms]) => ms.pp > 0)); + this.debug(`Disable: disabling move ${moveSlot.move} in slot ${slotIndex}`); this.add('-start', pokemon, 'Disable', moveSlot.move); this.effectState.move = moveSlot.id; + this.effectState.slotIndex = slotIndex; // 1-8 turns (which will in effect translate to 0-7 missed turns for the target) this.effectState.time = this.random(1, 9); }, - onEnd(pokemon) { - this.add('-end', pokemon, 'Disable'); - }, onBeforeMovePriority: 6, onBeforeMove(pokemon, target, move) { pokemon.volatiles['disable'].time--; @@ -253,20 +236,17 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, onDisableMove(pokemon) { - for (const moveSlot of pokemon.moveSlots) { - if (moveSlot.id === this.effectState.move) { - pokemon.disableMove(moveSlot.id); - } + // disable the move slot + if (pokemon.moveSlots.length > this.effectState.slotIndex) { + pokemon.moveSlots[this.effectState.slotIndex].disabled = true; + pokemon.moveSlots[this.effectState.slotIndex].disabledSource = this.effect.name; } }, }, - secondary: null, - target: "normal", - type: "Normal", }, dizzypunch: { inherit: true, - secondary: null, + secondary: undefined, // no inherit }, doubleedge: { inherit: true, @@ -319,11 +299,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { focusenergy: { inherit: true, condition: { - onStart(pokemon) { - this.add('-start', pokemon, 'move: Focus Energy'); - }, + inherit: true, // This does nothing as it's dealt with on critical hit calculation. - onModifyMove() {}, + onModifyCritRatio: undefined, // no inherit }, }, glare: { @@ -349,6 +327,12 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { for (const pokemon of this.getAllActive()) { pokemon.clearBoosts(); if (pokemon !== source) { + if (['frz', 'slp'].includes(pokemon.status)) { + pokemon.side.lastSelectedMove = 'cannotmove' as ID; + if (this.queue.willMove(pokemon)) { + this.queue.changeAction(pokemon, { choice: 'move', pokemon, moveid: 'cannotmove' }); + } + } pokemon.cureStatus(true); } if (pokemon.status === 'tox') { @@ -406,11 +390,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, leechseed: { inherit: true, - onHit() {}, + onHit: undefined, // no inherit condition: { - onStart(target) { - this.add('-start', target, 'move: Leech Seed'); - }, + inherit: true, onAfterMoveSelfPriority: 1, onAfterMoveSelf(pokemon) { const leecher = this.getAtSlot(pokemon.volatiles['leechseed'].sourceSlot); @@ -436,15 +418,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, }, lightscreen: { - num: 113, - accuracy: true, - basePower: 0, - category: "Status", - name: "Light Screen", - pp: 30, - priority: 0, - flags: { metronome: 1 }, + inherit: true, volatileStatus: 'lightscreen', + sideCondition: undefined, // no inherit onTryHit(pokemon) { if (pokemon.volatiles['lightscreen']) { return false; @@ -456,14 +432,28 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, }, target: "self", - type: "Psychic", + }, + metronome: { + inherit: true, + onHit(pokemon) { + const moves = this.dex.moves.all().filter(move => ( + (!move.isNonstandard || move.isNonstandard === 'Unobtainable') && move.flags['metronome'] + )); + let randomMove = ''; + if (moves.length) { + moves.sort((a, b) => a.num - b.num); + randomMove = this.sample(moves).id; + } + if (!randomMove) return false; + pokemon.side.lastSelectedMove = this.toID(randomMove); + this.actions.useMove(randomMove, pokemon); + }, }, mimic: { inherit: true, flags: { protect: 1, bypasssub: 1, metronome: 1 }, onHit(target, source) { - const moveslot = source.moves.indexOf('mimic'); - if (moveslot < 0) return false; + const moveslot = source.side.lastSelectedMoveSlot; const moves = target.moves; const moveid = this.sample(moves); if (!moveid) return false; @@ -472,7 +462,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { move: move.name, id: move.id, pp: source.moveSlots[moveslot].pp, - maxpp: move.pp * 8 / 5, + maxpp: this.calculatePP(move, source.ppUps[moveslot] || 0), target: move.target, disabled: false, used: false, @@ -481,6 +471,13 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-start', source, 'Mimic', move.name); }, }, + minimize: { + inherit: true, + condition: { + inherit: true, + onSourceModifyDamage: undefined, // no inherit + }, + }, mirrormove: { inherit: true, onHit(pokemon) { @@ -495,9 +492,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { mist: { inherit: true, condition: { - onStart(pokemon) { - this.add('-start', pokemon, 'Mist'); - }, + inherit: true, onTryBoost(boost, target, source, effect) { if (effect.effectType === 'Move' && effect.category !== 'Status') return; if (source && target !== source) { @@ -523,7 +518,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, petaldance: { inherit: true, - onMoveFail() {}, + onMoveFail: undefined, // no inherit }, poisonsting: { inherit: true, @@ -546,9 +541,15 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, basePower: 1, damageCallback(pokemon) { + if ([0, 1, 171].includes(pokemon.level)) { + this.hint("Desync Clause Mod activated!"); + this.hint("In Gen 1, if a Pokémon at level 0, 1 or 171 uses Psywave, the game softlocks."); + return false; + } const psywaveDamage = (this.random(0, this.trunc(1.5 * pokemon.level))); if (psywaveDamage <= 0) { this.hint("Desync Clause Mod activated!"); + this.hint("In Gen 1, Psywave can roll 0 damage."); return false; } return psywaveDamage; @@ -595,7 +596,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, recover: { inherit: true, - heal: null, + heal: undefined, // no inherit onHit(target) { if (target.hp === target.maxhp) return false; // Fail when health is 255 or 511 less than max, unless it is divisible by 256 @@ -613,15 +614,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, }, reflect: { - num: 115, - accuracy: true, - basePower: 0, - category: "Status", - name: "Reflect", - pp: 20, - priority: 0, - flags: { metronome: 1 }, + inherit: true, volatileStatus: 'reflect', + sideCondition: undefined, // no inherit onTryHit(pokemon) { if (pokemon.volatiles['reflect']) { return false; @@ -632,13 +627,11 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-start', pokemon, 'Reflect'); }, }, - secondary: null, target: "self", - type: "Psychic", }, rest: { inherit: true, - onTry() {}, + onTry: undefined, // no inherit onHit(target, source, move) { if (target.hp === target.maxhp) return false; // Fail when health is 255 or 511 less than max, unless it is divisible by 256 @@ -661,12 +654,12 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { roar: { inherit: true, forceSwitch: false, - onTryHit() {}, + onTryHit: undefined, // no inherit priority: 0, }, rockslide: { inherit: true, - secondary: null, + secondary: undefined, // no inherit target: "normal", }, rockthrow: { @@ -742,7 +735,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, softboiled: { inherit: true, - heal: null, + heal: undefined, // no inherit onHit(target) { if (target.hp === target.maxhp) return false; // Fail when health is 255 or 511 less than max, unless it is divisible by 256 @@ -763,18 +756,10 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, pp: 10, recoil: [1, 2], - onModifyMove() {}, + onModifyMove: undefined, // no inherit }, substitute: { - num: 164, - accuracy: true, - basePower: 0, - category: "Status", - name: "Substitute", - pp: 10, - priority: 0, - flags: { metronome: 1 }, - volatileStatus: 'substitute', + inherit: true, onTryHit(target) { if (target.volatiles['substitute']) { this.add('-fail', target, 'move: Substitute'); @@ -794,11 +779,16 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, condition: { + inherit: true, onStart(target) { this.add('-start', target, 'Substitute'); this.effectState.hp = Math.floor(target.maxhp / 4) + 1; - delete target.volatiles['partiallytrapped']; + if (target.volatiles['partiallytrapped']) { + this.add('-end', target, target.volatiles['partiallytrapped'].sourceEffect, '[partiallytrapped]', '[silent]'); + delete target.volatiles['partiallytrapped']; + } }, + onTryPrimaryHit: undefined, // no inherit onTryHitPriority: -1, onTryHit(target, source, move) { if (move.category === 'Status') { @@ -862,13 +852,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } return 0; }, - onEnd(target) { - this.add('-end', target, 'Substitute'); - }, }, - secondary: null, - target: "self", - type: "Normal", }, superfang: { inherit: true, @@ -877,7 +861,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, thrash: { inherit: true, - onMoveFail() {}, + onMoveFail: undefined, // no inherit }, thunder: { inherit: true, @@ -888,14 +872,14 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, triattack: { inherit: true, - onHit() {}, - secondary: null, + onHit: undefined, // no inherit + secondary: undefined, // no inherit }, whirlwind: { inherit: true, accuracy: 85, forceSwitch: false, - onTryHit() {}, + onTryHit: undefined, // no inherit priority: 0, }, wingattack: { diff --git a/data/mods/gen1/rulesets.ts b/data/mods/gen1/rulesets.ts index 6d246c9793..d6bfeaa805 100644 --- a/data/mods/gen1/rulesets.ts +++ b/data/mods/gen1/rulesets.ts @@ -1,8 +1,17 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { + standardag: { + inherit: true, + ruleset: [ + 'Obtainable', 'Desync Clause Mod', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause', + ], + }, standard: { effectType: 'ValidatorRule', name: 'Standard', - ruleset: ['Obtainable', 'Desync Clause Mod', 'Sleep Clause Mod', 'Freeze Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'], + ruleset: [ + 'Standard AG', + 'Sleep Clause Mod', 'Freeze Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', + ], banlist: ['Dig', 'Fly'], }, '350cupmod': { diff --git a/data/mods/gen1/scripts.ts b/data/mods/gen1/scripts.ts index 118b5ac213..83812bfa95 100644 --- a/data/mods/gen1/scripts.ts +++ b/data/mods/gen1/scripts.ts @@ -25,6 +25,27 @@ export const Scripts: ModdedBattleScriptsData = { // BattlePokemon scripts. pokemon: { inherit: true, + deductPP(move, amount) { + // deduct PP based on side.lastSelectedMoveSlot + const ppData = this.getMoveSlot(this.side.lastSelectedMoveSlot); + if (!ppData) return 0; + ppData.used = true; + + if (!amount) amount = 1; + ppData.pp -= amount; + + if (ppData.pp < 0) { + this.battle.hint("In Gen 1, if a Pokémon is forced to use a move with 0 PP, the move will underflow to have 63 PP."); + } + ppData.pp = ((ppData.pp % 64) + 64) % 64; + + if (ppData.virtual && !this.transformed) { + // sync PP from Mimic's slot, or Metronome/Mirror Move that called Mimic + this.baseMoveSlots[this.side.lastSelectedMoveSlot].pp = ppData.pp; + } + + return amount; + }, getStat(statName, unmodified) { // @ts-expect-error type checking prevents 'hp' from being passed, but we're paranoid if (statName === 'hp') throw new Error("Please read `maxhp` directly"); @@ -136,12 +157,30 @@ export const Scripts: ModdedBattleScriptsData = { } } - // If a faster partial trapping move misses against a user of Hyper Beam during a recharge turn, - // the user of Hyper Beam will automatically use Hyper Beam during that turn. - if (move.id === 'recharge' && !pokemon.volatiles['mustrecharge'] && !pokemon.volatiles['partiallytrapped']) { - move = this.battle.dex.getActiveMove('hyperbeam'); - this.battle.hint(`In Gen 1, partial trapping moves like Wrap remove Hyper Beam recharges. ` + - `If the target would have recharged, it will automatically use Hyper Beam instead.`, true); + const abortMove = () => { + this.battle.clearActiveMove(true); + this.battle.runEvent('AfterMoveSelf', pokemon, target, move); + }; + + if (move.id === 'cannotmove') { + if (pokemon.status === 'slp') { + this.battle.hint( + "In Gen 1, if a Pokémon spends a turn partially trapped and switches to a Pokémon that is asleep, " + + "the sleep counter will not decrease until you select a move with a different Pokémon." + ); + } else if (pokemon.getLockedMove()) { + this.battle.hint( + "In Gen 1, when Haze cures the sleep/freeze status of a Pokémon during a multi-turn move, " + + "that Pokémon will become soft-locked." + ); + } else if (pokemon.getSemiLockedMove()) { + this.battle.hint( + "In Gen 1, when Haze cures the sleep/freeze status of a Pokémon during Bide, " + + "the move execution will never resolve." + ); + } + abortMove(); + return; } if (target?.subFainted) target.subFainted = null; @@ -149,37 +188,36 @@ export const Scripts: ModdedBattleScriptsData = { this.battle.setActiveMove(move, pokemon, target); if (pokemon.moveThisTurn || !this.battle.runEvent('BeforeMove', pokemon, target, move)) { - this.battle.clearActiveMove(true); - // This is only run for sleep. - this.battle.runEvent('AfterMoveSelf', pokemon, target, move); + abortMove(); return; } if (move.beforeMoveCallback?.call(this.battle, pokemon, target, move)) { - this.battle.clearActiveMove(true); + abortMove(); return; } - const lockedMove = pokemon.getLockedMove(); - if (lockedMove) sourceEffect = move; + if (move.id !== 'struggle') { + const lockedMove = pokemon.getLockedMove() || pokemon.getSemiLockedMove(); + if (lockedMove) sourceEffect = move; - // Locked moves don't deduct PP - // Two-turn moves like Sky Attack deduct PP on their second turn. - if (!lockedMove || pokemon.volatiles['twoturnmove']) { - const ppMove = pokemon.volatiles['twoturnmove']?.ppMove || move.id; - pokemon.deductPP(ppMove, null, target); - const moveSlot = pokemon.getMoveData(ppMove); - if (moveSlot && moveSlot.pp < 0) { - moveSlot.pp += 64; - this.battle.hint("In Gen 1, if a pokemon is forced to use a move with 0 PP, the move will underflow to have 63 PP."); + // Locked moves don't deduct PP + // Two-turn moves like Sky Attack deduct PP on their second turn. + if ((!lockedMove && !TWO_TURN_MOVES.includes(move.id)) || pokemon.volatiles['twoturnmove']) { + const moveSlot = pokemon.getMoveSlot(pokemon.side.lastSelectedMoveSlot); + if (moveSlot) pokemon.deductPP(moveSlot.id, null, target); + } + + if (!lockedMove && move.id !== pokemon.getMoveSlot(pokemon.side.lastSelectedMoveSlot)?.id) { + this.battle.hint("Desync Clause Mod activated!"); + this.battle.hint( + "In Gen 1, a Pokémon might default to using a move that doesn't match the move of the slot it last selected.", + ); + abortMove(); + return; } } this.useMove(move, pokemon, { target, sourceEffect }); - - if (pokemon.volatiles['twoturnmove']) { - pokemon.deductPP(move, -1, target); - pokemon.volatiles['twoturnmove'].ppMove = move.id; - } }, // This function deals with AfterMoveSelf events. // This leads with partial trapping moves shenanigans after the move has been used. @@ -195,6 +233,19 @@ export const Scripts: ModdedBattleScriptsData = { } if (sourceEffect) move.sourceEffect = sourceEffect.id; + if (sourceEffect?.id === 'metronome' || sourceEffect?.id === 'mirrormove') { + if (TWO_TURN_MOVES.includes(move.id)) { + const moveSlot = pokemon.getMoveSlot(pokemon.side.lastSelectedMoveSlot); + if (moveSlot) pokemon.deductPP(moveSlot.id, -1, target); + } + // FIXME: this should happen even if the slot was empty before Transform + // https://bulbapedia.bulbagarden.net/wiki/List_of_Transform_glitches#Transform_.2B_Mirror_Move.2FMetronome_PP_error + if (pokemon.transformed && pokemon.side.lastSelectedMoveSlot < pokemon.baseMoveSlots.length) { + pokemon.baseMoveSlots[pokemon.side.lastSelectedMoveSlot].pp += 1; + pokemon.baseMoveSlots[pokemon.side.lastSelectedMoveSlot].pp %= 64; + } + } + this.battle.singleEvent('ModifyMove', move, null, pokemon, target, move, move); if (baseMove.target !== move.target) { // Target changed in ModifyMove, so we must adjust it here @@ -414,7 +465,7 @@ export const Scripts: ModdedBattleScriptsData = { let i: number; for (i = 0; i < hits && target.hp && pokemon.hp; i++) { move.hit = i + 1; - if (move.hit === hits) move.lastHit = true; + move.lastHit = move.hit === hits; moveDamage = this.moveHit(target, pokemon, move); if (moveDamage === false) break; damage = (moveDamage || 0); diff --git a/data/mods/gen1jpn/moves.ts b/data/mods/gen1jpn/moves.ts index 3e26d6af8e..75dbc55f6e 100644 --- a/data/mods/gen1jpn/moves.ts +++ b/data/mods/gen1jpn/moves.ts @@ -13,12 +13,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { substitute: { inherit: true, condition: { - onStart(target) { - this.add('-start', target, 'Substitute'); - this.effectState.hp = Math.floor(target.maxhp / 4) + 1; - delete target.volatiles['partiallytrapped']; - }, - onTryHitPriority: -1, + inherit: true, onTryHit(target, source, move) { if (move.drain) { this.add('-miss', source); @@ -76,9 +71,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } return accuracy; }, - onEnd(target) { - this.add('-end', target, 'Substitute'); - }, }, }, swift: { diff --git a/data/mods/gen1jpn/rulesets.ts b/data/mods/gen1jpn/rulesets.ts index 29d433d8d3..201cc114e6 100644 --- a/data/mods/gen1jpn/rulesets.ts +++ b/data/mods/gen1jpn/rulesets.ts @@ -2,7 +2,10 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable standard: { effectType: 'ValidatorRule', name: 'Standard', - ruleset: ['Obtainable', 'Desync Clause Mod', 'Sleep Clause Mod', 'Freeze Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'], + ruleset: [ + 'Standard AG', + 'Sleep Clause Mod', 'Freeze Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', + ], banlist: ['Dig', 'Fly'], }, nc1997movelegality: { diff --git a/data/mods/gen1stadium/conditions.ts b/data/mods/gen1stadium/conditions.ts index 8709455f95..f39ad0fbe0 100644 --- a/data/mods/gen1stadium/conditions.ts +++ b/data/mods/gen1stadium/conditions.ts @@ -101,7 +101,7 @@ export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDa }, flinch: { inherit: true, - onStart() {}, + onStart: undefined, // no inherit }, partiallytrapped: { name: 'partiallytrapped', diff --git a/data/mods/gen1stadium/moves.ts b/data/mods/gen1stadium/moves.ts index 275351378c..5c9f729588 100644 --- a/data/mods/gen1stadium/moves.ts +++ b/data/mods/gen1stadium/moves.ts @@ -160,11 +160,11 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { volatileStatus: 'rage', }, condition: { + inherit: true, // Rage lock onStart(target, source, effect) { this.effectState.move = 'rage'; }, - onLockMove: 'rage', onHit(target, source, move) { if (target.boosts.atk < 6 && (move.category !== 'Status' || move.id === 'disable')) { this.boost({ atk: 1 }); @@ -174,7 +174,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, recover: { inherit: true, - heal: null, onHit(target) { if (target.hp === target.maxhp) { return false; @@ -197,7 +196,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, softboiled: { inherit: true, - heal: null, onHit(target) { // Fail when health is 255 or 511 less than max if (target.hp === target.maxhp) { @@ -220,12 +218,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, condition: { - onStart(target) { - this.add('-start', target, 'Substitute'); - this.effectState.hp = Math.floor(target.maxhp / 4); - delete target.volatiles['partiallytrapped']; - }, - onTryHitPriority: -1, + inherit: true, onTryHit(target, source, move) { if (target === source) { this.debug('sub bypass: self hit'); @@ -275,11 +268,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } return 0; }, - onEnd(target) { - this.add('-end', target, 'Substitute'); - }, }, - secondary: null, target: "self", type: "Normal", }, diff --git a/data/mods/gen1stadium/rulesets.ts b/data/mods/gen1stadium/rulesets.ts index 716eb00d5a..6d81137ec5 100644 --- a/data/mods/gen1stadium/rulesets.ts +++ b/data/mods/gen1stadium/rulesets.ts @@ -1,7 +1,763 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { + standardag: { + inherit: true, + ruleset: [ + 'Obtainable', 'Exact HP Mod', 'Cancel Mod', + ], + }, standard: { effectType: 'ValidatorRule', name: 'Standard', - ruleset: ['Obtainable', 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Exact HP Mod', 'Cancel Mod'], + ruleset: [ + 'Standard AG', + 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', + ], + }, + stadiumpokecuprentals: { + inherit: true, + onChangeSet(set, format, setHas, teamHas) { + set.level = 50; + switch (this.dex.species.get(set.species).name) { + case 'Bulbasaur': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Leech Seed', 'Toxic', 'Body Slam', 'Razor Leaf']; + break; + case 'Ivysaur': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Razor Leaf', 'Sleep Powder', 'Growth', 'Double-Edge']; + break; + case 'Venusaur': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Psychic', 'Seismic Toss', 'Reflect', 'Thunder Wave']; + break; + case 'Charmander': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Flamethrower', 'Slash', 'Dig', 'Fire Spin']; + break; + case 'Charmeleon': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Flamethrower', 'Counter', 'Seismic Toss', 'Strength']; + break; + case 'Charizard': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Fly', 'Swords Dance', 'Fire Spin', 'Fire Blast']; + break; + case 'Squirtle': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Surf', 'Blizzard', 'Body Slam', 'Dig']; + break; + case 'Wartortle': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Surf', 'Strength', 'Rest', 'Ice Beam']; + break; + case 'Blastoise': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Hydro Pump', 'Skull Bash', 'Withdraw', 'Seismic Toss']; + break; + case 'Caterpie': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['String Shot', 'Tackle']; + break; + case 'Metapod': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['String Shot', 'Tackle']; + break; + case 'Butterfree': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Psychic', 'Supersonic', 'Mega Drain', 'Stun Spore']; + break; + case 'Weedle': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['String Shot', 'Poison Sting']; + break; + case 'Kakuna': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['String Shot', 'Poison Sting']; + break; + case 'Beedrill': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Twineedle', 'Hyper Beam', 'Toxic', 'Focus Energy']; + break; + case 'Pidgey': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Fly', 'Toxic', 'Double-Edge', 'Double Team']; + break; + case 'Pidgeotto': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Fly', 'Quick Attack', 'Sand Attack', 'Take Down']; + break; + case 'Pidgeot': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Mirror Move', 'Fly', 'Quick Attack', 'Sand Attack']; + break; + case 'Rattata': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Super Fang', 'Blizzard', 'Quick Attack', 'Hyper Fang']; + break; + case 'Raticate': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Hyper Fang', 'Hyper Beam', 'Focus Energy', 'Thunder']; + break; + case 'Spearow': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Drill Peck', 'Mirror Move', 'Double Team', 'Double-Edge']; + break; + case 'Fearow': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Drill Peck', 'Mirror Move', 'Fury Attack', 'Swift']; + break; + case 'Ekans': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Earthquake', 'Acid', 'Screech', 'Body Slam']; + break; + case 'Arbok': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Glare', 'Wrap', 'Dig', 'Strength']; + break; + case 'Pikachu': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Thunderbolt', 'Slam', 'Thunder Wave', 'Seismic Toss']; + break; + case 'Raichu': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Thunder', 'Thunder Wave', 'Flash', 'Mega Kick']; + break; + case 'Sandshrew': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Earthquake', 'Slash', 'Seismic Toss', 'Sand Attack']; + break; + case 'Sandslash': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Dig', 'Swift', 'Seismic Toss', 'Sand Attack']; + break; + case 'Nidoran-F': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Toxic', 'Thunderbolt', 'Body Slam', 'Blizzard']; + break; + case 'Nidorina': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Toxic', 'Thunder', 'Double-Edge', 'Ice Beam']; + break; + case 'Nidoqueen': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Toxic', 'Double Kick', 'Bite', 'Earthquake']; + break; + case 'Nidoran-M': + set.evs = { hp: 177, atk: 176, def: 176, spa: 176, spd: 176, spe: 176 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Blizzard', 'Body Slam', 'Thunderbolt', 'Focus Energy']; + break; + case 'Nidorino': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Double-Edge', 'Horn Drill', 'Focus Energy', 'Thunder']; + break; + case 'Nidoking': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Earthquake', 'Horn Drill', 'Rage', 'Substitute']; + break; + case 'Clefairy': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Thunderbolt', 'Psychic', 'Body Slam', 'Blizzard']; + break; + case 'Clefable': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Sing', 'Tri Attack', 'Minimize', 'Ice Beam']; + break; + case 'Vulpix': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Flamethrower', 'Dig', 'Confuse Ray', 'Double-Edge']; + break; + case 'Ninetales': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Fire Blast', 'Skull Bash', 'Confuse Ray', 'Tail Whip']; + break; + case 'Jigglypuff': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Sing', 'Body Slam', 'Seismic Toss', 'Psychic']; + break; + case 'Wigglytuff': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Sing', 'Double-Edge', 'Submission', 'Thunderbolt']; + break; + case 'Zubat': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Confuse Ray', 'Mega Drain', 'Toxic', 'Double-Edge']; + break; + case 'Golbat': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Confuse Ray', 'Mega Drain', 'Bite', 'Haze']; + break; + case 'Oddish': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Petal Dance', 'Toxic', 'Mega Drain', 'Double-Edge']; + break; + case 'Gloom': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Petal Dance', 'Take Down', 'Mega Drain', 'Stun Spore']; + break; + case 'Vileplume': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Petal Dance', 'Sleep Powder', 'Acid', 'Cut']; + break; + case 'Paras': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Spore', 'Slash', 'Dig', 'Mega Drain']; + break; + case 'Parasect': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Spore', 'Take Down', 'Dig', 'Solar Beam']; + break; + case 'Venonat': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Psychic', 'Mega Drain', 'Double-Edge', 'Stun Spore']; + break; + case 'Venomoth': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Psychic', 'Supersonic', 'Solar Beam', 'Swift']; + break; + case 'Diglett': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Earthquake', 'Slash', 'Sand Attack', 'Rock Slide']; + break; + case 'Dugtrio': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Dig', 'Sand Attack', 'Toxic', 'Hyper Beam']; + break; + case 'Meowth': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Slash', 'Thunderbolt', 'Swift', 'Double Team']; + break; + case 'Persian': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Slash', 'Bubble Beam', 'Mimic', 'Growl']; + break; + case 'Psyduck': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Surf', 'Confusion', 'Dig', 'Blizzard']; + break; + case 'Golduck': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Ice Beam', 'Surf', 'Toxic', 'Disable']; + break; + case 'Mankey': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Submission', 'Rock Slide', 'Seismic Toss', 'Screech']; + break; + case 'Primeape': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Fury Swipes', 'Rock Slide', 'Low Kick', 'Screech']; + break; + case 'Growlithe': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Flamethrower', 'Body Slam', 'Reflect', 'Dig']; + break; + case 'Arcanine': + set.evs = { hp: 105, atk: 104, def: 104, spa: 104, spd: 104, spe: 104 }; + set.ivs = { hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0 }; + set.moves = ['Fire Blast', 'Take Down', 'Dragon Rage', 'Substitute']; + break; + case 'Poliwag': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Body Slam', 'Blizzard', 'Surf', 'Amnesia']; + break; + case 'Poliwhirl': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Hypnosis', 'Surf', 'Ice Beam', 'Earthquake']; + break; + case 'Poliwrath': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Hypnosis', 'Submission', 'Counter', 'Hydro Pump']; + break; + case 'Abra': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Psychic', 'Seismic Toss', 'Reflect', 'Thunder Wave']; + break; + case 'Kadabra': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Psychic', 'Counter', 'Recover', 'Dig']; + break; + case 'Alakazam': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Psybeam', 'Metronome', 'Disable', 'Tri Attack']; + break; + case 'Machop': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Submission', 'Rock Slide', 'Earthquake', 'Focus Energy']; + break; + case 'Machoke': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Submission', 'Strength', 'Rock Slide', 'Focus Energy']; + break; + case 'Machamp': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Low Kick', 'Strength', 'Counter', 'Focus Energy']; + break; + case 'Bellsprout': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Razor Leaf', 'Growth', 'Mega Drain', 'Stun Spore']; + break; + case 'Weepinbell': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Razor Leaf', 'Acid', 'Wrap', 'Toxic']; + break; + case 'Victreebel': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Solar Beam', 'Acid', 'Reflect', 'Slam']; + break; + case 'Tentacool': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Surf', 'Supersonic', 'Mega Drain', 'Blizzard']; + break; + case 'Tentacruel': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Acid', 'Supersonic', 'Hydro Pump', 'Cut']; + break; + case 'Geodude': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Earthquake', 'Seismic Toss', 'Rock Slide', 'Explosion']; + break; + case 'Graveler': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Earthquake', 'Seismic Toss', 'Strength', 'Self-Destruct']; + break; + case 'Golem': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Dig', 'Seismic Toss', 'Fire Blast', 'Metronome']; + break; + case 'Ponyta': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Fire Blast', 'Agility', 'Horn Drill', 'Body Slam']; + break; + case 'Rapidash': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Fire Blast', 'Stomp', 'Toxic', 'Fire Spin']; + break; + case 'Slowpoke': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Surf', 'Psychic', 'Thunder Wave', 'Amnesia']; + break; + case 'Slowbro': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Surf', 'Psychic', 'Disable', 'Withdraw']; + break; + case 'Magnemite': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Thunderbolt', 'Thunder Wave', 'Supersonic', 'Double-Edge']; + break; + case 'Magneton': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Thunderbolt', 'Screech', 'Supersonic', 'Swift']; + break; + case 'Farfetch\u2019d': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Slash', 'Sand Attack', 'Toxic', 'Fly']; + break; + case 'Doduo': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Drill Peck', 'Tri Attack', 'Double Team', 'Reflect']; + break; + case 'Dodrio': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Fly', 'Tri Attack', 'Agility', 'Reflect']; + break; + case 'Seel': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Ice Beam', 'Body Slam', 'Horn Drill', 'Surf']; + break; + case 'Dewgong': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Aurora Beam', 'Heabutt', 'Rest', 'Surf']; + break; + case 'Grimer': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Sludge', 'Body Slam', 'Explosion', 'Screech']; + break; + case 'Muk': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Sludge', 'Thunderbolt', 'Hyper Beam', 'Self-Destruct']; + break; + case 'Shellder': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Surf', 'Explosion', 'Blizzard', 'Tri Attack']; + break; + case 'Cloyster': + set.evs = { hp: 105, atk: 104, def: 104, spa: 104, spd: 104, spe: 104 }; + set.ivs = { hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0 }; + set.moves = ['Clamp', 'Spike Cannon', 'Ice Beam', 'Supersonic']; + break; + case 'Gastly': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Hypnosis', 'Dream Eater', 'Psychic', 'Confuse Ray']; + break; + case 'Haunter': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Mega Drain', 'Psychic', 'Explosion', 'Confuse Ray']; + break; + case 'Gengar': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Thunderbolt', 'Night Shade', 'Hypnosis', 'Confuse Ray']; + break; + case 'Onix': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Earthquake', 'Rock Slide', 'Strength', 'Explosion']; + break; + case 'Drowzee': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Hypnois', 'Dream Eater', 'Psychic', 'Tri Attack']; + break; + case 'Hypno': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Hypnosis', 'Headbutt', 'Dream Eater', 'Meditate']; + break; + case 'Krabby': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Crabhammer', 'Guillotine', 'Double-Edge', 'Blizzard']; + break; + case 'Kingler': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Crabhammer', 'Guillotine', 'Stomp', 'Substitute']; + break; + case 'Voltorb': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Thunderbolt', 'Thunder Wave', 'Swift', 'Explosion']; + break; + case 'Electrode': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Thunder', 'Thunder Wave', 'Swift', 'Self-Destruct']; + break; + case 'Exeggcute': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Psychic', 'Explosion', 'Leech Seed', 'Toxic']; + break; + case 'Exeggutor': + set.evs = { hp: 105, atk: 104, def: 104, spa: 104, spd: 104, spe: 104 }; + set.ivs = { hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0 }; + set.moves = ['Mega Drain', 'Stun Spore', 'Leech Seed', 'Egg Bomb']; + break; + case 'Cubone': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Earthquake', 'Submission', 'Blizzard', 'Strength']; + break; + case 'Marowak': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Bonemerang', 'Thrash', 'Fire Blast', 'Focus Energy']; + break; + case 'Hitmonlee': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['High Jump Kick', 'Mega Kick', 'Metronome', 'Seismic Toss']; + break; + case 'Hitmonchan': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Submission', 'Thunder Punch', 'Ice Punch', 'Strength']; + break; + case 'Lickitung': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Strength', 'Blizzard', 'Thunder', 'Fire Blast']; + break; + case 'Koffing': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Sludge', 'Toxic', 'Thunderbolt', 'Explosion']; + break; + case 'Weezing': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Sludge', 'Hyper Beam', 'Fire Blast', 'Self-Destruct']; + break; + case 'Rhyhorn': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Earthquake', 'Body Slam', 'Rock Slide', 'Fire Blast']; + break; + case 'Rhydon': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Dig', 'Strength', 'Thunder', 'Surf']; + break; + case 'Chansey': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Thunder', 'Fire Blast', 'Minimize', 'Rest']; + break; + case 'Tangela': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Mega Drain', 'Growth', 'Toxic', 'Double-Edge']; + break; + case 'Kangaskhan': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Dizzy Punch', 'Rock Slide', 'Surf', 'Thunderbolt']; + break; + case 'Horsea': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Hydro Pump', 'Toxic', 'Smokescreen', 'Ice Beam']; + break; + case 'Seadra': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Surf', 'Toxic', 'Smokescreen', 'Swift']; + break; + case 'Goldeen': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Surf', 'Supersonic', 'Horn Drill', 'Blizzard']; + break; + case 'Seaking': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Waterfall', 'Supersonic', 'Horn Attack', 'Ice Beam']; + break; + case 'Staryu': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Hydro Pump', 'Recover', 'Thunderbolt', 'Psychic']; + break; + case 'Starmie': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Surf', 'Thunder', 'Swift', 'Harden']; + break; + case 'Mr. Mime': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Barrier', 'Psychic', 'Metronome', 'Seismic Toss']; + break; + case 'Scyther': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Slash', 'Wing Attack', 'Leer', 'Double Team']; + break; + case 'Jynx': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Ice Punch', 'Mega Punch', 'Psychic', 'Lovely Kiss']; + break; + case 'Electabuzz': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Thunder Punch', 'Mega Punch', 'Psychic', 'Thunder Wave']; + break; + case 'Magmar': + set.evs = { hp: 121, atk: 120, def: 120, spa: 120, spd: 120, spe: 120 }; + set.ivs = { hp: 6, atk: 8, def: 8, spa: 6, spd: 6, spe: 6 }; + set.moves = ['Fire Punch', 'Mega Punch', 'Psychic', 'Smokescreen']; + break; + case 'Pinsir': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Strength', 'Harden', 'Seismic Toss', 'Guillotine']; + break; + case 'Tauros': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Double-Edge', 'Fire Blast', 'Tail Whip', 'Bide']; + break; + case 'Magikarp': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Splash', 'Tackle']; + break; + case 'Gyarados': + set.evs = { hp: 105, atk: 104, def: 104, spa: 104, spd: 104, spe: 104 }; + set.ivs = { hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0 }; + set.moves = ['Surf', 'Dragon Rage', 'Bite', 'Fire Blast']; + break; + case 'Lapras': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Ice Beam', 'Solar Beam', 'Body Slam', 'Sing']; + break; + case 'Ditto': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Transform']; + break; + case 'Eevee': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Body Slam', 'Swift', 'Sand Attack', 'Toxic']; + break; + case 'Vaporeon': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Surf', 'Quick Attack', 'Sand Attack', 'Acid Armor']; + break; + case 'Jolteon': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Thunderbolt', 'Pin Missile', 'Toxic', 'Sand Attack']; + break; + case 'Flareon': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Fire Blast', 'Take Down', 'Smog', 'Sand Attack']; + break; + case 'Omanyte': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Surf', 'Ice Beam', 'Double Edge', 'Double Team']; + break; + case 'Omastar': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Hydro Pump', 'Submission', 'Spike Cannon', 'Withdraw']; + break; + case 'Kabuto': + set.evs = { hp: 145, atk: 144, def: 144, spa: 144, spd: 144, spe: 144 }; + set.ivs = { hp: 12, atk: 12, def: 10, spa: 12, spd: 12, spe: 10 }; + set.moves = ['Hydro Pump', 'Blizzard', 'Slash', 'Double Team']; + break; + case 'Kabutops': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Surf', 'Swords Dance', 'Mega Kick', 'Submission']; + break; + case 'Aerodactyl': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Fly', 'Hyper Beam', 'Supersonic', 'Dragon Rage']; + break; + case 'Snorlax': + set.evs = { hp: 113, atk: 112, def: 112, spa: 112, spd: 112, spe: 112 }; + set.ivs = { hp: 4, atk: 4, def: 4, spa: 4, spd: 4, spe: 6 }; + set.moves = ['Mega Kick', 'Rock Slide', 'Metronome', 'Rest']; + break; + case 'Articuno': + set.evs = { hp: 97, atk: 96, def: 96, spa: 96, spd: 96, spe: 96 }; + set.ivs = { hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0 }; + set.moves = ['Ice Beam', 'Sky Attack', 'Razor Wind', 'Substitute']; + break; + case 'Zapdos': + set.evs = { hp: 97, atk: 96, def: 96, spa: 96, spd: 96, spe: 96 }; + set.ivs = { hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0 }; + set.moves = ['Thunderbolt', 'Sky Attack', 'Thunder Wave', 'Flash']; + break; + case 'Moltres': + set.evs = { hp: 97, atk: 96, def: 96, spa: 96, spd: 96, spe: 96 }; + set.ivs = { hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0 }; + set.moves = ['Fire Blast', 'Fly', 'Swift', 'Substitute']; + break; + case 'Dratini': + set.evs = { hp: 161, atk: 160, def: 160, spa: 160, spd: 160, spe: 160 }; + set.ivs = { hp: 14, atk: 12, def: 14, spa: 14, spd: 14, spe: 14 }; + set.moves = ['Hyper Beam', 'Body Slam', 'Thunderbolt', 'Thunder Wave']; + break; + case 'Dragonair': + set.evs = { hp: 129, atk: 128, def: 128, spa: 128, spd: 128, spe: 128 }; + set.ivs = { hp: 10, atk: 8, def: 10, spa: 10, spd: 10, spe: 8 }; + set.moves = ['Hyper Beam', 'Swift', 'Ice Beam', 'Thunder Wave']; + break; + case 'Dragonite': + set.evs = { hp: 97, atk: 96, def: 96, spa: 96, spd: 96, spe: 96 }; + set.ivs = { hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0 }; + set.moves = ['Slam', 'Dragon Rage', 'Thunder', 'Agility']; + } + }, }, }; diff --git a/data/mods/gen1stadium/scripts.ts b/data/mods/gen1stadium/scripts.ts index 04071bb678..fb6380a046 100644 --- a/data/mods/gen1stadium/scripts.ts +++ b/data/mods/gen1stadium/scripts.ts @@ -93,8 +93,7 @@ export const Scripts: ModdedBattleScriptsData = { return; } } - let lockedMove = this.battle.runEvent('LockMove', pokemon); - if (lockedMove === true) lockedMove = false; + const lockedMove = pokemon.getLockedMove() || pokemon.getSemiLockedMove(); if ( !lockedMove && (!pokemon.volatiles['partialtrappinglock'] || pokemon.volatiles['partialtrappinglock'].locked !== target) @@ -332,7 +331,7 @@ export const Scripts: ModdedBattleScriptsData = { let i: number; for (i = 0; i < hits && target.hp && pokemon.hp; i++) { move.hit = i + 1; - if (move.hit === hits) move.lastHit = true; + move.lastHit = move.hit === hits; moveDamage = this.moveHit(target, pokemon, move); if (moveDamage === false) break; damage = (moveDamage || 0); diff --git a/data/mods/gen2/conditions.ts b/data/mods/gen2/conditions.ts index 55812c82af..f30c844f9f 100644 --- a/data/mods/gen2/conditions.ts +++ b/data/mods/gen2/conditions.ts @@ -62,8 +62,8 @@ export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDa this.add('cant', pokemon, 'frz'); return false; }, - onModifyMove() {}, - onDamagingHit() {}, + onModifyMove: undefined, // no inherit + onDamagingHit: undefined, // no inherit onAfterMoveSecondary(target, source, move) { if ((move.secondary && move.secondary.status === 'brn') || move.statusRoll === 'brn') { target.cureStatus(); @@ -187,7 +187,7 @@ export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDa delete target.volatiles['confusion']; if (!target.side.getSideCondition('safeguard')) target.addVolatile('confusion'); }, - onLockMove(pokemon) { + onLockMove() { return this.effectState.move; }, onMoveAborted(pokemon) { 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/items.ts b/data/mods/gen2/items.ts index c31e371bc9..1a559bceb5 100644 --- a/data/mods/gen2/items.ts +++ b/data/mods/gen2/items.ts @@ -5,7 +5,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, blackbelt: { inherit: true, - onModifyAtk() {}, + onModifyAtk: undefined, // no inherit onModifyDamage(damage, source, target, move) { if (move?.type === 'Fighting') { return damage * 1.1; @@ -14,7 +14,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, blackglasses: { inherit: true, - onModifySpA() {}, + onModifySpA: undefined, // no inherit onModifyDamage(damage, source, target, move) { if (move?.type === 'Dark') { return damage * 1.1; @@ -31,7 +31,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, charcoal: { inherit: true, - onModifySpA() {}, + onModifySpA: undefined, // no inherit onModifyDamage(damage, source, target, move) { if (move?.type === 'Fire') { return damage * 1.1; @@ -40,7 +40,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, dragonfang: { inherit: true, - onModifySpA() {}, + onModifySpA: undefined, // no inherit }, dragonscale: { inherit: true, @@ -65,7 +65,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, hardstone: { inherit: true, - onModifyAtk() {}, + onModifyAtk: undefined, // no inherit onModifyDamage(damage, source, target, move) { if (move?.type === 'Rock') { return damage * 1.1; @@ -106,7 +106,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { lightball: { inherit: true, // In Gen 2 this happens in stat calculation directly. - onModifySpA() {}, + onModifySpA: undefined, // no inherit }, loveball: { inherit: true, @@ -127,7 +127,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, magnet: { inherit: true, - onModifySpA() {}, + onModifySpA: undefined, // no inherit onModifyDamage(damage, source, target, move) { if (move?.type === 'Electric') { return damage * 1.1; @@ -136,7 +136,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, metalcoat: { inherit: true, - onModifyAtk() {}, + onModifyAtk: undefined, // no inherit onModifyDamage(damage, source, target, move) { if (move?.type === 'Steel') { return damage * 1.1; @@ -146,12 +146,12 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { metalpowder: { inherit: true, // In Gen 2 this happens in stat calculation directly. - onModifyDef() {}, - onModifySpD() {}, + onModifyDef: undefined, // no inherit + onModifySpD: undefined, // no inherit }, miracleseed: { inherit: true, - onModifySpA() {}, + onModifySpA: undefined, // no inherit onModifyDamage(damage, source, target, move) { if (move?.type === 'Grass') { return damage * 1.1; @@ -164,7 +164,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, mysticwater: { inherit: true, - onModifySpA() {}, + onModifySpA: undefined, // no inherit onModifyDamage(damage, source, target, move) { if (move?.type === 'Water') { return damage * 1.1; @@ -173,7 +173,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, nevermeltice: { inherit: true, - onModifySpA() {}, + onModifySpA: undefined, // no inherit onModifyDamage(damage, source, target, move) { if (move?.type === 'Ice') { return damage * 1.1; @@ -182,7 +182,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, poisonbarb: { inherit: true, - onModifyAtk() {}, + onModifyAtk: undefined, // no inherit onModifyDamage(damage, source, target, move) { if (move?.type === 'Poison') { return damage * 1.1; @@ -191,7 +191,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, sharpbeak: { inherit: true, - onModifyAtk() {}, + onModifyAtk: undefined, // no inherit onModifyDamage(damage, source, target, move) { if (move?.type === 'Flying') { return damage * 1.1; @@ -200,7 +200,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, silverpowder: { inherit: true, - onModifyAtk() {}, + onModifyAtk: undefined, // no inherit onModifyDamage(damage, source, target, move) { if (move?.type === 'Bug') { return damage * 1.1; @@ -209,7 +209,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, softsand: { inherit: true, - onModifyAtk() {}, + onModifyAtk: undefined, // no inherit onModifyDamage(damage, source, target, move) { if (move?.type === 'Ground') { return damage * 1.1; @@ -218,7 +218,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, spelltag: { inherit: true, - onModifyAtk() {}, + onModifyAtk: undefined, // no inherit onModifyDamage(damage, source, target, move) { if (move?.type === 'Ghost') { return damage * 1.1; @@ -241,11 +241,11 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { thickclub: { inherit: true, // In Gen 2 this happens in stat calculation directly. - onModifyAtk() {}, + onModifyAtk: undefined, // no inherit }, twistedspoon: { inherit: true, - onModifySpA() {}, + onModifySpA: undefined, // no inherit onModifyDamage(damage, source, target, move) { if (move?.type === 'Psychic') { return damage * 1.1; @@ -290,7 +290,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, pinkbow: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifyDamage(damage, source, target, move) { if (move?.type === 'Normal') { return damage * 1.1; @@ -300,7 +300,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, polkadotbow: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifyDamage(damage, source, target, move) { if (move?.type === 'Normal') { return damage * 1.1; diff --git a/data/mods/gen2/moves.ts b/data/mods/gen2/moves.ts index 1aadb96470..c75e5a214f 100644 --- a/data/mods/gen2/moves.ts +++ b/data/mods/gen2/moves.ts @@ -51,64 +51,12 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { bide: { inherit: true, condition: { - duration: 3, + inherit: true, durationCallback(target, source, effect) { return this.random(3, 5); }, - onLockMove: 'bide', - onStart(pokemon) { - this.effectState.totalDamage = 0; - this.add('-start', pokemon, 'move: Bide'); - }, - onDamagePriority: -101, - onDamage(damage, target, source, move) { - if (!move || move.effectType !== 'Move' || !source) return; - this.effectState.totalDamage += damage; - this.effectState.lastDamageSource = source; - }, - onBeforeMove(pokemon, target, move) { - if (this.effectState.duration === 1) { - this.add('-end', pokemon, 'move: Bide'); - if (!this.effectState.totalDamage) { - this.add('-fail', pokemon); - return false; - } - target = this.effectState.lastDamageSource; - if (!target) { - this.add('-fail', pokemon); - return false; - } - if (!target.isActive) { - const possibleTarget = this.getRandomTarget(pokemon, this.dex.moves.get('pound')); - if (!possibleTarget) { - this.add('-miss', pokemon); - return false; - } - target = possibleTarget; - } - const moveData = { - id: 'bide', - name: "Bide", - accuracy: 100, - damage: this.effectState.totalDamage * 2, - category: "Physical", - priority: 0, - flags: { contact: 1, protect: 1 }, - effectType: 'Move', - type: 'Normal', - } as unknown as ActiveMove; - this.actions.tryMoveHit(target, pokemon, moveData); - pokemon.removeVolatile('bide'); - return false; - } - this.add('-activate', pokemon, 'move: Bide'); - }, - onMoveAborted(pokemon) { - pokemon.removeVolatile('bide'); - }, - onEnd(pokemon) { - this.add('-end', pokemon, 'move: Bide', '[silent]'); - }, + onLockMove: undefined, // no inherit + onSemiLockMove: 'bide', }, }, counter: { @@ -123,8 +71,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } return false; }, - beforeTurnCallback() {}, - onTry() {}, + beforeTurnCallback: undefined, // no inherit + onTry: undefined, // no inherit condition: {}, priority: -1, }, @@ -139,12 +87,12 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { curse: { inherit: true, condition: { - onStart(pokemon, source) { - this.add('-start', pokemon, 'Curse', `[of] ${source}`); - }, + inherit: true, + onAfterMoveSelfPriority: 0, // explicit onAfterMoveSelf(pokemon) { this.damage(pokemon.baseMaxhp / 4); }, + onResidual: undefined, // no inherit }, }, detect: { @@ -157,10 +105,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { return source.status !== 'slp'; }, condition: { - duration: 2, - onImmunity(type, pokemon) { - if (type === 'sandstorm') return false; - }, + inherit: true, onInvulnerability(target, source, move) { if (move.id === 'earthquake' || move.id === 'magnitude' || move.id === 'fissure') { return; @@ -172,6 +117,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { if (source.volatiles['lockon'] && target === source.volatiles['lockon'].source) return; return false; }, + onSourceModifyDamage: undefined, // no inherit onSourceBasePower(basePower, target, source, move) { if (move.id === 'earthquake' || move.id === 'magnitude') { return this.chainModify(2); @@ -186,9 +132,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { encore: { inherit: true, condition: { - durationCallback() { - return this.random(3, 7); - }, + inherit: true, onStart(target) { const lockedMove = target.lastMoveEncore?.id || ''; const moveSlot = lockedMove ? target.getMoveData(lockedMove) : null; @@ -199,30 +143,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.effectState.move = lockedMove; this.add('-start', target, 'Encore'); }, - onOverrideAction(pokemon) { - return this.effectState.move; - }, onResidualOrder: 13, - onResidual(target) { - const lockedMoveSlot = target.getMoveData(this.effectState.move); - if (lockedMoveSlot && lockedMoveSlot.pp <= 0) { - // early termination if you run out of PP - target.removeVolatile('encore'); - } - }, - onEnd(target) { - this.add('-end', target, 'Encore'); - }, - onDisableMove(pokemon) { - if (!this.effectState.move || !pokemon.hasMove(this.effectState.move)) { - return; - } - for (const moveSlot of pokemon.moveSlots) { - if (moveSlot.id !== this.effectState.move) { - pokemon.disableMove(moveSlot.id); - } - } - }, + onResidualSubOrder: undefined, // no inherit }, }, endure: { @@ -244,7 +166,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { return source.status !== 'slp'; }, condition: { - duration: 2, + inherit: true, onInvulnerability(target, source, move) { if (move.id === 'gust' || move.id === 'twister' || move.id === 'thunder' || move.id === 'whirlwind') { return; @@ -260,6 +182,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { if (source.volatiles['lockon'] && target === source.volatiles['lockon'].source) return; return false; }, + onSourceModifyDamage: undefined, // no inherit onSourceBasePower(basePower, target, source, move) { if (move.id === 'gust' || move.id === 'twister') { return this.chainModify(2); @@ -270,9 +193,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { focusenergy: { inherit: true, condition: { - onStart(pokemon) { - this.add('-start', pokemon, 'move: Focus Energy'); - }, + inherit: true, onModifyCritRatio(critRatio) { return critRatio + 1; }, @@ -284,17 +205,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { if (target.volatiles['foresight']) return false; }, condition: { - onStart(pokemon) { - this.add('-start', pokemon, 'Foresight'); - }, - onNegateImmunity(pokemon, type) { - if (pokemon.hasType('Ghost') && ['Normal', 'Fighting'].includes(type)) return false; - }, - onModifyBoost(boosts) { - if (boosts.evasion && boosts.evasion > 0) { - boosts.evasion = 0; - } - }, + inherit: true, + noCopy: false, }, }, frustration: { @@ -338,11 +250,10 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, leechseed: { inherit: true, - onHit() {}, + onHit: undefined, // no inherit condition: { - onStart(target) { - this.add('-start', target, 'move: Leech Seed'); - }, + inherit: true, + onResidual: undefined, // no inherit onAfterMoveSelfPriority: 2, onAfterMoveSelf(pokemon) { if (!pokemon.hp) return; @@ -378,19 +289,15 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { if (target.volatiles['foresight'] || target.volatiles['lockon']) return false; }, condition: { - duration: 2, - onSourceAccuracy(accuracy, target, source, move) { - if (move && source === this.effectState.target && target === this.effectState.source) return true; - }, + inherit: true, + onSourceInvulnerability: undefined, // no inherit }, }, lowkick: { inherit: true, accuracy: 90, basePower: 50, - basePowerCallback() { - return 50; - }, + basePowerCallback: undefined, // no inherit secondary: { chance: 30, volatileStatus: 'flinch', @@ -427,8 +334,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } return false; }, - beforeTurnCallback() {}, - onTry() {}, + beforeTurnCallback: undefined, // no inherit + onTry: undefined, // no inherit condition: {}, priority: -1, }, @@ -449,15 +356,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, }, mist: { - num: 54, - accuracy: true, - basePower: 0, - category: "Status", - name: "Mist", - pp: 30, - priority: 0, - flags: { metronome: 1 }, + inherit: true, volatileStatus: 'mist', + sideCondition: undefined, // no inherit condition: { onStart(pokemon) { this.add('-start', pokemon, 'Mist'); @@ -478,9 +379,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, }, - secondary: null, target: "self", - type: "Ice", }, moonlight: { inherit: true, @@ -509,13 +408,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { nightmare: { inherit: true, condition: { - noCopy: true, - onStart(pokemon) { - if (pokemon.status !== 'slp') { - return false; - } - this.add('-start', pokemon, 'Nightmare'); - }, + inherit: true, + onResidual: undefined, // no inherit onAfterMoveSelfPriority: 1, onAfterMoveSelf(pokemon) { if (pokemon.status === 'slp') this.damage(pokemon.baseMaxhp / 4); @@ -535,16 +429,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { perishsong: { inherit: true, condition: { - duration: 4, - onEnd(target) { - this.add('-start', target, 'perish0'); - target.faint(); - }, + inherit: true, onResidualOrder: 4, - onResidual(pokemon) { - const duration = pokemon.volatiles['perishsong'].duration; - this.add('-start', pokemon, `perish${duration}`); - }, }, }, petaldance: { @@ -573,9 +459,18 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, pursuit: { inherit: true, - onModifyMove() {}, + 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: undefined, // no inherit condition: { - duration: 1, + inherit: true, onBeforeSwitchOut(pokemon) { this.debug('Pursuit start'); let alreadyAdded = false; @@ -649,7 +544,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { target.statusState.source = target; this.heal(target.maxhp); }, - secondary: null, }, return: { inherit: true, @@ -675,41 +569,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { safeguard: { inherit: true, condition: { - duration: 5, - durationCallback(target, source, effect) { - if (source?.hasAbility('persistent')) { - this.add('-activate', source, 'ability: Persistent', effect); - return 7; - } - return 5; - }, - onSetStatus(status, target, source, effect) { - if (!effect || !source) return; - if (effect.id === 'yawn') return; - if (effect.effectType === 'Move' && effect.infiltrates && !target.isAlly(source)) return; - if (target !== source) { - this.debug('interrupting setStatus'); - if (effect.id === 'synchronize' || (effect.effectType === 'Move' && !effect.secondaries)) { - this.add('-activate', target, 'move: Safeguard'); - } - return null; - } - }, - onTryAddVolatile(status, target, source, effect) { - if (!effect || !source) return; - if (effect.effectType === 'Move' && effect.infiltrates && !target.isAlly(source)) return; - if ((status.id === 'confusion' || status.id === 'yawn') && target !== source) { - if (effect.effectType === 'Move' && !effect.secondaries) this.add('-activate', target, 'move: Safeguard'); - return null; - } - }, - onSideStart(side) { - this.add('-sidestart', side, 'Safeguard'); - }, + inherit: true, onSideResidualOrder: 8, - onSideEnd(side) { - this.add('-sideend', side, 'Safeguard'); - }, }, }, selfdestruct: { @@ -736,7 +597,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { onPrepareHit(target, source) { return source.status !== 'slp'; }, - secondary: null, + secondary: undefined, // no inherit }, slash: { inherit: true, @@ -766,7 +627,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { return source.status !== 'slp'; }, // Rain weakening done directly in the damage formula - onBasePower() {}, + onBasePower: undefined, // no inherit }, spiderweb: { inherit: true, @@ -775,31 +636,14 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { spikes: { inherit: true, condition: { - // this is a side condition - onSideStart(side) { - if (!this.effectState.layers || this.effectState.layers === 0) { - this.add('-sidestart', side, 'Spikes'); - this.effectState.layers = 1; - } else { - return false; - } - }, - onSwitchIn(pokemon) { - if (!pokemon.runImmunity('Ground')) return; - const damageAmounts = [0, 3]; - this.damage(damageAmounts[this.effectState.layers] * pokemon.maxhp / 24); - }, + inherit: true, + onSideRestart: undefined, // no inherit }, }, substitute: { inherit: true, condition: { - onStart(target) { - this.add('-start', target, 'Substitute'); - this.effectState.hp = Math.floor(target.maxhp / 4); - delete target.volatiles['partiallytrapped']; - }, - onTryPrimaryHitPriority: -1, + inherit: true, onTryPrimaryHit(target, source, move) { if (move.stallingMove) { this.add('-fail', source); @@ -852,9 +696,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.runEvent('AfterSubDamage', target, source, move, damage); return this.HIT_SUBSTITUTE; }, - onEnd(target) { - this.add('-end', target, 'Substitute'); - }, }, }, swagger: { @@ -880,7 +721,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, thief: { inherit: true, - onAfterHit() {}, + onAfterHit: undefined, // no inherit secondary: { chance: 100, onHit(target, source) { @@ -916,7 +757,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { triattack: { inherit: true, onHit(target, source, move) { - move.statusRoll = ['par', 'frz', 'brn'][this.random(3)]; + move.statusRoll = this.sample(['par', 'frz', 'brn']); }, secondary: { chance: 20, diff --git a/data/mods/gen2/rulesets.ts b/data/mods/gen2/rulesets.ts index 72919d415c..ad992422e1 100644 --- a/data/mods/gen2/rulesets.ts +++ b/data/mods/gen2/rulesets.ts @@ -28,7 +28,10 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable standard: { effectType: 'ValidatorRule', name: 'Standard', - ruleset: ['Obtainable', 'Sleep Clause Mod', 'Freeze Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Items Clause', 'Evasion Moves Clause', 'Endless battle Clause', 'HP Percentage Mod', 'Cancel Mod'], + ruleset: [ + 'Standard AG', + 'Sleep Clause Mod', 'Freeze Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Items Clause', 'Evasion Moves Clause', + ], banlist: [ 'Hypnosis + Mean Look', 'Hypnosis + Spider Web', diff --git a/data/mods/gen2/scripts.ts b/data/mods/gen2/scripts.ts index d564f84d97..5bb79245ba 100644 --- a/data/mods/gen2/scripts.ts +++ b/data/mods/gen2/scripts.ts @@ -125,8 +125,7 @@ export const Scripts: ModdedBattleScriptsData = { } } pokemon.lastDamage = 0; - let lockedMove = this.battle.runEvent('LockMove', pokemon); - if (lockedMove === true) lockedMove = false; + const lockedMove = pokemon.getLockedMove() || pokemon.getSemiLockedMove(); if (!lockedMove) { if (!pokemon.deductPP(move, null, target) && (move.id !== 'struggle')) { this.battle.add('cant', pokemon, 'nopp', move); @@ -273,7 +272,7 @@ export const Scripts: ModdedBattleScriptsData = { for (i = 0; i < hits && target.hp && pokemon.hp; i++) { if (pokemon.status === 'slp' && !isSleepUsable) break; move.hit = i + 1; - if (move.hit === hits) move.lastHit = true; + move.lastHit = move.hit === hits; moveDamage = this.moveHit(target, pokemon, move); if (moveDamage === false) break; if (nullDamage && (moveDamage || moveDamage === 0 || moveDamage === undefined)) nullDamage = false; diff --git a/data/mods/gen2stadium2/items.ts b/data/mods/gen2stadium2/items.ts index 990e14c2a4..a9d11a1181 100644 --- a/data/mods/gen2stadium2/items.ts +++ b/data/mods/gen2stadium2/items.ts @@ -10,6 +10,6 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, dragonscale: { inherit: true, - onModifyDamage() {}, + onModifyDamage: undefined, // no inherit }, }; diff --git a/data/mods/gen2stadium2/rulesets.ts b/data/mods/gen2stadium2/rulesets.ts index 0bbab70192..7da1a4ed93 100644 --- a/data/mods/gen2stadium2/rulesets.ts +++ b/data/mods/gen2stadium2/rulesets.ts @@ -1,8 +1,17 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { + standardag: { + inherit: true, + ruleset: [ + 'Obtainable', 'Team Preview', 'Exact HP Mod', 'Cancel Mod', 'Beat Up Nicknames Mod', + ], + }, standard: { effectType: 'ValidatorRule', name: 'Standard', - ruleset: ['Obtainable', 'Team Preview', 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Self-KO Clause', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Exact HP Mod', 'Cancel Mod', 'Stadium Items Clause'], + ruleset: [ + 'Standard AG', + 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Self-KO Clause', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Stadium Items Clause', + ], }, selfkoclause: { effectType: 'Rule', diff --git a/data/mods/gen2stadium2/scripts.ts b/data/mods/gen2stadium2/scripts.ts index 9a9ddce00a..3487c31df4 100644 --- a/data/mods/gen2stadium2/scripts.ts +++ b/data/mods/gen2stadium2/scripts.ts @@ -208,7 +208,7 @@ export const Scripts: ModdedBattleScriptsData = { for (i = 0; i < hits && target.hp && pokemon.hp; i++) { if (pokemon.status === 'slp' && !isSleepUsable) break; move.hit = i + 1; - if (move.hit === hits) move.lastHit = true; + move.lastHit = move.hit === hits; moveDamage = this.moveHit(target, pokemon, move); if (moveDamage === false) break; if (nullDamage && (moveDamage || moveDamage === 0 || moveDamage === undefined)) nullDamage = false; diff --git a/data/mods/gen3/abilities.ts b/data/mods/gen3/abilities.ts index 86958fe650..05d84a50c5 100644 --- a/data/mods/gen3/abilities.ts +++ b/data/mods/gen3/abilities.ts @@ -12,15 +12,9 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa effectspore: { inherit: true, onDamagingHit(damage, target, source, move) { - if (damage && move.flags['contact'] && !source.status) { - const r = this.random(300); - if (r < 10) { - source.setStatus('slp', target); - } else if (r < 20) { - source.setStatus('par', target); - } else if (r < 30) { - source.setStatus('psn', target); - } + if (damage && move.flags['contact'] && this.randomChance(1, 10)) { + const status = this.sample(['slp', 'par', 'psn']); + source.trySetStatus(status, target); } }, }, @@ -91,6 +85,8 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa }, }, lightningrod: { + inherit: true, + onAnyRedirectTarget: undefined, // no inherit onFoeRedirectTarget(target, source, source2, move) { // don't count Hidden Power as Electric-type if (this.dex.moves.get(move.id).type !== 'Electric') return; @@ -98,15 +94,11 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa return this.effectState.target; } }, - flags: { breakable: 1 }, - name: "Lightning Rod", - rating: 0, - num: 32, }, magnetpull: { inherit: true, - onFoeTrapPokemon() {}, - onFoeMaybeTrapPokemon() {}, + onFoeTrapPokemon: undefined, // no inherit + onFoeMaybeTrapPokemon: undefined, // no inherit onAnyTrapPokemon(pokemon) { if (pokemon.hasType('Steel') && pokemon.isAdjacent(this.effectState.target)) { pokemon.tryTrap(true); @@ -158,7 +150,7 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa }, raindish: { inherit: true, - onWeather() {}, + onWeather: undefined, // no inherit onResidualOrder: 10, onResidualSubOrder: 3, onResidual(pokemon) { @@ -193,7 +185,7 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa }, trace: { inherit: true, - onUpdate() {}, + onUpdate: undefined, // no inherit onStart(pokemon) { const target = pokemon.side.randomFoe(); if (!target || target.fainted) return; @@ -204,7 +196,7 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa }, truant: { inherit: true, - onStart() {}, + onStart: undefined, // no inherit onSwitchIn(pokemon) { pokemon.truantTurn = this.turn !== 0; }, diff --git a/data/mods/gen3/conditions.ts b/data/mods/gen3/conditions.ts index 79d353ebba..6f176de671 100644 --- a/data/mods/gen3/conditions.ts +++ b/data/mods/gen3/conditions.ts @@ -51,6 +51,6 @@ export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDa }, sandstorm: { inherit: true, - onModifySpD() {}, + onModifySpD: undefined, // no inherit }, }; 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/items.ts b/data/mods/gen3/items.ts index 30526bd86b..5a1054053c 100644 --- a/data/mods/gen3/items.ts +++ b/data/mods/gen3/items.ts @@ -1,7 +1,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { aguavberry: { inherit: true, - onUpdate() {}, + onUpdate: undefined, // no inherit onResidualOrder: 10, onResidualSubOrder: 4, onResidual(pokemon) { @@ -12,7 +12,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, apicotberry: { inherit: true, - onUpdate() {}, + onUpdate: undefined, // no inherit onResidualOrder: 10, onResidualSubOrder: 4, onResidual(pokemon) { @@ -23,7 +23,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, berryjuice: { inherit: true, - onUpdate() {}, + onUpdate: undefined, // no inherit onResidualOrder: 10, onResidualSubOrder: 4, onResidual(pokemon) { @@ -37,7 +37,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, blackbelt: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifyAtkPriority: 1, onModifyAtk(atk, user, target, move) { if (move?.type === 'Fighting') { @@ -47,7 +47,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, blackglasses: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifySpAPriority: 1, onModifySpA(spa, user, target, move) { if (move?.type === 'Dark') { @@ -57,7 +57,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, charcoal: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifySpAPriority: 1, onModifySpA(spa, user, target, move) { if (move?.type === 'Fire') { @@ -67,7 +67,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, dragonfang: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifySpAPriority: 1, onModifySpA(spa, user, target, move) { if (move?.type === 'Dragon') { @@ -82,6 +82,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { num: 208, gen: 3, isNonstandard: "Unobtainable", + // No competitive use }, fastball: { inherit: true, @@ -89,7 +90,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, figyberry: { inherit: true, - onUpdate() {}, + onUpdate: undefined, // no inherit onResidualOrder: 10, onResidualSubOrder: 4, onResidual(pokemon) { @@ -100,7 +101,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, ganlonberry: { inherit: true, - onUpdate() {}, + onUpdate: undefined, // no inherit onResidualOrder: 10, onResidualSubOrder: 4, onResidual(pokemon) { @@ -111,7 +112,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, hardstone: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifyAtkPriority: 1, onModifyAtk(atk, user, target, move) { if (move?.type === 'Rock') { @@ -125,7 +126,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, iapapaberry: { inherit: true, - onUpdate() {}, + onUpdate: undefined, // no inherit onResidualOrder: 10, onResidualSubOrder: 4, onResidual(pokemon) { @@ -151,7 +152,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, lansatberry: { inherit: true, - onUpdate() {}, + onUpdate: undefined, // no inherit onResidualOrder: 10, onResidualSubOrder: 4, onResidual(pokemon) { @@ -174,7 +175,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, liechiberry: { inherit: true, - onUpdate() {}, + onUpdate: undefined, // no inherit onResidualOrder: 10, onResidualSubOrder: 4, onResidual(pokemon) { @@ -190,7 +191,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { return this.chainModify(2); } }, - onBasePower() {}, + onBasePower: undefined, // no inherit }, loveball: { inherit: true, @@ -202,7 +203,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, magnet: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifySpAPriority: 1, onModifySpA(spa, user, target, move) { if (move?.type === 'Electric') { @@ -212,7 +213,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, magoberry: { inherit: true, - onUpdate() {}, + onUpdate: undefined, // no inherit onResidualOrder: 10, onResidualSubOrder: 4, onResidual(pokemon) { @@ -223,7 +224,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, metalcoat: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifyAtkPriority: 1, onModifyAtk(atk, user, target, move) { if (move?.type === 'Steel') { @@ -233,7 +234,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, miracleseed: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifySpAPriority: 1, onModifySpA(spa, user, target, move) { if (move?.type === 'Grass') { @@ -247,7 +248,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, mysticwater: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifySpAPriority: 1, onModifySpA(spa, user, target, move) { if (move?.type === 'Water') { @@ -257,7 +258,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, nevermeltice: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifySpAPriority: 1, onModifySpA(spa, user, target, move) { if (move?.type === 'Ice') { @@ -267,7 +268,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, oranberry: { inherit: true, - onUpdate() {}, + onUpdate: undefined, // no inherit onResidualOrder: 10, onResidualSubOrder: 4, onResidual(pokemon) { @@ -278,7 +279,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, petayaberry: { inherit: true, - onUpdate() {}, + onUpdate: undefined, // no inherit onResidualOrder: 10, onResidualSubOrder: 4, onResidual(pokemon) { @@ -289,7 +290,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, poisonbarb: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifyAtkPriority: 1, onModifyAtk(atk, user, target, move) { if (move?.type === 'Poison') { @@ -299,12 +300,12 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, quickclaw: { inherit: true, - onFractionalPriority() {}, + onFractionalPriority: undefined, // no inherit // implemented in Pokemon#getActionSpeed() }, salacberry: { inherit: true, - onUpdate() {}, + onUpdate: undefined, // no inherit onResidualOrder: 10, onResidualSubOrder: 4, onResidual(pokemon) { @@ -315,7 +316,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, seaincense: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifySpAPriority: 1, onModifySpA(spa, user, target, move) { if (move?.type === 'Water') { @@ -325,7 +326,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, sharpbeak: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifyAtkPriority: 1, onModifyAtk(atk, user, target, move) { if (move?.type === 'Flying') { @@ -335,7 +336,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, silkscarf: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifyAtkPriority: 1, onModifyAtk(atk, user, target, move) { if (move?.type === 'Normal') { @@ -345,7 +346,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, silverpowder: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifyAtkPriority: 1, onModifyAtk(atk, user, target, move) { if (move?.type === 'Bug') { @@ -355,7 +356,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, sitrusberry: { inherit: true, - onUpdate() {}, + onUpdate: undefined, // no inherit onResidualOrder: 10, onResidualSubOrder: 4, onResidual(pokemon) { @@ -369,7 +370,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, softsand: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifyAtkPriority: 1, onModifyAtk(atk, user, target, move) { if (move?.type === 'Ground') { @@ -379,7 +380,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, spelltag: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifyAtkPriority: 1, onModifyAtk(atk, user, target, move) { if (move?.type === 'Ghost') { @@ -393,7 +394,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, starfberry: { inherit: true, - onUpdate() {}, + onUpdate: undefined, // no inherit onResidualOrder: 10, onResidualSubOrder: 4, onResidual(pokemon) { @@ -404,7 +405,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, twistedspoon: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifySpAPriority: 1, onModifySpA(spa, user, target, move) { if (move?.type === 'Psychic') { @@ -414,7 +415,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, wikiberry: { inherit: true, - onUpdate() {}, + onUpdate: undefined, // no inherit onResidualOrder: 10, onResidualSubOrder: 4, onResidual(pokemon) { diff --git a/data/mods/gen3/moves.ts b/data/mods/gen3/moves.ts index 9764e11df8..06cdde7a04 100644 --- a/data/mods/gen3/moves.ts +++ b/data/mods/gen3/moves.ts @@ -26,10 +26,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, astonish: { inherit: true, - basePowerCallback(pokemon, target) { - if (target.volatiles['minimize']) return 60; - return 30; - }, + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, minimize: 1 }, }, beatup: { inherit: true, @@ -44,8 +41,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { duration: 1, onModifySpAPriority: -101, onModifySpA(atk, pokemon, defender, move) { - // https://www.smogon.com/forums/posts/8992145/ - // this.add('-activate', pokemon, 'move: Beat Up', '[of] ' + move.allies![0].name); + if (!this.ruleTable.has('beatupnicknamesmod')) { + this.add('-activate', pokemon, 'move: Beat Up', '[of] ' + move.allies![0].name); + } this.event.modifier = 1; return this.dex.species.get(move.allies!.shift()!.set.species).baseStats.atk; }, @@ -61,18 +59,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { accuracy: 100, priority: 0, condition: { - duration: 3, - onLockMove: 'bide', - onStart(pokemon) { - this.effectState.totalDamage = 0; - this.add('-start', pokemon, 'move: Bide'); - }, - onDamagePriority: -101, - onDamage(damage, target, source, move) { - if (!move || move.effectType !== 'Move' || !source) return; - this.effectState.totalDamage += damage; - this.effectState.lastDamageSource = source; - }, + inherit: true, + onAfterSetStatus: undefined, // no inherit onBeforeMove(pokemon, target, move) { if (this.effectState.duration === 1) { this.add('-end', pokemon, 'move: Bide'); @@ -110,17 +98,11 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } this.add('-activate', pokemon, 'move: Bide'); }, - onMoveAborted(pokemon) { - pokemon.removeVolatile('bide'); - }, - onEnd(pokemon) { - this.add('-end', pokemon, 'move: Bide', '[silent]'); - }, }, }, blizzard: { inherit: true, - onModifyMove() { }, + onModifyMove: undefined, // no inherit }, brickbreak: { inherit: true, @@ -133,7 +115,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, charge: { inherit: true, - boosts: null, + boosts: undefined, // no inherit }, conversion: { inherit: true, @@ -181,17 +163,12 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { counter: { inherit: true, condition: { - duration: 1, - noCopy: true, - onStart(target, source, move) { - this.effectState.slot = null; - this.effectState.damage = 0; - }, - onRedirectTargetPriority: -1, + inherit: true, onRedirectTarget(target, source, source2) { if (source !== this.effectState.target || !this.effectState.slot) return; return this.getAtSlot(this.effectState.slot); }, + onDamagingHit: undefined, // no inherit onDamagePriority: -101, onDamage(damage, target, source, effect) { if ( @@ -225,48 +202,13 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, accuracy: 55, flags: { protect: 1, mirror: 1, bypasssub: 1, metronome: 1 }, - volatileStatus: 'disable', condition: { + inherit: true, durationCallback() { return this.random(2, 6); }, - noCopy: true, - onStart(pokemon) { - if (!this.queue.willMove(pokemon)) { - this.effectState.duration!++; - } - if (!pokemon.lastMove) { - return false; - } - for (const moveSlot of pokemon.moveSlots) { - if (moveSlot.id === pokemon.lastMove.id) { - if (!moveSlot.pp) { - return false; - } else { - this.add('-start', pokemon, 'Disable', moveSlot.move); - this.effectState.move = pokemon.lastMove.id; - return; - } - } - } - return false; - }, - onEnd(pokemon) { - this.add('-end', pokemon, 'move: Disable'); - }, - onBeforeMove(attacker, defender, move) { - if (move.id === this.effectState.move) { - this.add('cant', attacker, 'Disable', move); - return false; - } - }, - onDisableMove(pokemon) { - for (const moveSlot of pokemon.moveSlots) { - if (moveSlot.id === this.effectState.move) { - pokemon.disableMove(moveSlot.id); - } - } - }, + "onResidualOrder": undefined, // no inherit + "onResidualSubOrder": undefined, // no inherit }, }, dive: { @@ -310,51 +252,15 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, volatileStatus: 'encore', condition: { + inherit: true, durationCallback() { return this.random(3, 7); }, - onStart(target, source) { - const moveSlot = target.lastMove ? target.getMoveData(target.lastMove.id) : null; - if (!target.lastMove || target.lastMove.flags['failencore'] || !moveSlot || moveSlot.pp <= 0) { - // it failed - return false; - } - this.effectState.move = target.lastMove.id; - this.add('-start', target, 'Encore'); - }, - onOverrideAction(pokemon) { - return this.effectState.move; - }, - onResidualOrder: 10, - onResidualSubOrder: 14, - onResidual(target) { - const moveSlot = target.getMoveData(this.effectState.move); - if (moveSlot && moveSlot.pp <= 0) { - // early termination if you run out of PP - target.removeVolatile('encore'); - } - }, - onEnd(target) { - this.add('-end', target, 'Encore'); - }, - onDisableMove(pokemon) { - if (!this.effectState.move || !pokemon.hasMove(this.effectState.move)) { - return; - } - for (const moveSlot of pokemon.moveSlots) { - if (moveSlot.id !== this.effectState.move) { - pokemon.disableMove(moveSlot.id); - } - } - }, }, }, extrasensory: { inherit: true, - basePowerCallback(pokemon, target) { - if (target.volatiles['minimize']) return 160; - return 80; - }, + flags: { protect: 1, mirror: 1, metronome: 1, minimize: 1 }, }, fakeout: { inherit: true, @@ -396,15 +302,14 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, followme: { inherit: true, - volatileStatus: undefined, + volatileStatus: undefined, // no inherit slotCondition: 'followme', condition: { - duration: 1, + inherit: true, onStart(target, source, effect) { this.add('-singleturn', target, 'move: Follow Me'); this.effectState.slot = target.getSlot(); }, - onFoeRedirectTargetPriority: 1, onFoeRedirectTarget(target, source, source2, move) { const userSlot = this.getAtSlot(this.effectState.slot); if (this.validTarget(userSlot, source, move.target)) { @@ -502,17 +407,12 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { mirrorcoat: { inherit: true, condition: { - duration: 1, - noCopy: true, - onStart(target, source, move) { - this.effectState.slot = null; - this.effectState.damage = 0; - }, - onRedirectTargetPriority: -1, + inherit: true, onRedirectTarget(target, source, source2) { if (source !== this.effectState.target || !this.effectState.slot) return; return this.getAtSlot(this.effectState.slot); }, + onDamagingHit: undefined, // no inherit onDamagePriority: -101, onDamage(damage, target, source, effect) { if ( @@ -528,7 +428,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { mirrormove: { inherit: true, flags: { metronome: 1, failencore: 1, nosleeptalk: 1, noassist: 1 }, - onTryHit() { }, + onTryHit: undefined, // no inherit onHit(pokemon) { const noMirror = [ 'assist', 'curse', 'doomdesire', 'focuspunch', 'futuresight', 'magiccoat', 'metronome', 'mimic', 'mirrormove', 'naturepower', 'psychup', 'roleplay', 'sketch', 'sleeptalk', 'spikes', 'spitup', 'taunt', 'teeterdance', 'transform', @@ -553,10 +453,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, needlearm: { inherit: true, - basePowerCallback(pokemon, target) { - if (target.volatiles['minimize']) return 120; - return 60; - }, + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, minimize: 1 }, }, nightmare: { inherit: true, @@ -578,6 +475,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, @@ -681,28 +592,13 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, flags: { protect: 1, bypasssub: 1, metronome: 1 }, condition: { + inherit: true, duration: 2, - onStart(target) { - this.add('-start', target, 'move: Taunt'); - }, - onResidualOrder: 10, - onResidualSubOrder: 15, + durationCallback: undefined, // no inherit onEnd(target) { this.add('-end', target, 'move: Taunt', '[silent]'); }, - onDisableMove(pokemon) { - for (const moveSlot of pokemon.moveSlots) { - if (this.dex.moves.get(moveSlot.move).category === 'Status') { - pokemon.disableMove(moveSlot.id); - } - } - }, - onBeforeMove(attacker, defender, move) { - if (move.category === 'Status') { - this.add('cant', attacker, 'move: Taunt', move); - return false; - } - }, + onBeforeMovePriority: undefined, // no inherit }, }, teeterdance: { @@ -716,37 +612,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { uproar: { inherit: true, condition: { - onStart(target) { - this.add('-start', target, 'Uproar'); - // 2-5 turns - this.effectState.duration = this.random(2, 6); - }, - onResidual(target) { - if (target.volatiles['throatchop']) { - target.removeVolatile('uproar'); - return; - } - if (target.lastMove && target.lastMove.id === 'struggle') { - // don't lock - delete target.volatiles['uproar']; - } - this.add('-start', target, 'Uproar', '[upkeep]'); - }, - onResidualOrder: 10, - onResidualSubOrder: 11, - onEnd(target) { - this.add('-end', target, 'Uproar'); - }, - onLockMove: 'uproar', - onAnySetStatus(status, pokemon) { - if (status.id === 'slp') { - if (pokemon === this.effectState.target) { - this.add('-fail', pokemon, 'slp', '[from] Uproar', '[msg]'); - } else { - this.add('-fail', pokemon, 'slp', '[from] Uproar'); - } - return null; - } + inherit: true, + durationCallback() { + return this.random(2, 6); }, }, }, @@ -756,11 +624,11 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, volttackle: { inherit: true, - secondary: null, + secondary: undefined, // no inherit }, waterfall: { inherit: true, - secondary: null, + secondary: undefined, // no inherit }, weatherball: { inherit: true, diff --git a/data/mods/gen3/rulesets.ts b/data/mods/gen3/rulesets.ts index 1c6b949767..637f7d2197 100644 --- a/data/mods/gen3/rulesets.ts +++ b/data/mods/gen3/rulesets.ts @@ -3,14 +3,17 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable effectType: 'ValidatorRule', name: 'Standard', desc: "The standard ruleset for all official Smogon singles tiers (Ubers, OU, etc.)", - ruleset: ['Obtainable', 'Sleep Clause Mod', 'Switch Priority Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Items Clause', 'Evasion Moves Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'], + ruleset: [ + 'Standard AG', + 'Sleep Clause Mod', 'Switch Priority Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Items Clause', 'Evasion Moves Clause', + ], }, standarddraft: { effectType: 'ValidatorRule', name: 'Standard Draft', desc: "The custom Draft League ruleset", ruleset: [ - 'Obtainable', 'Nickname Clause', '+Unreleased', 'Sleep Clause Mod', 'OHKO Clause', 'Evasion Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod', + 'Obtainable', 'Nickname Clause', 'Beat Up Nicknames Mod', '+Unreleased', 'Sleep Clause Mod', 'OHKO Clause', 'Evasion Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod', 'One Boost Passer Clause', 'Freeze Clause Mod', 'Accuracy Moves Clause', 'Baton Pass Trap Clause', ], banlist: [ diff --git a/data/mods/gen3/scripts.ts b/data/mods/gen3/scripts.ts index fd0d8b31a8..de3150b0fd 100644 --- a/data/mods/gen3/scripts.ts +++ b/data/mods/gen3/scripts.ts @@ -409,6 +409,7 @@ export const Scripts: ModdedBattleScriptsData = { for (i = 0; i < hits && target.hp && pokemon.hp; i++) { if (pokemon.status === 'slp' && !isSleepUsable) break; move.hit = i + 1; + move.lastHit = move.hit === hits; if (move.multiaccuracy && i > 0) { accuracy = move.accuracy; diff --git a/data/mods/gen3colosseum/moves.ts b/data/mods/gen3colosseum/moves.ts index 5ed069932f..c8f9e6f5d0 100644 --- a/data/mods/gen3colosseum/moves.ts +++ b/data/mods/gen3colosseum/moves.ts @@ -5,30 +5,20 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { perishsong: { inherit: true, onTryMove(attacker, defender, move) { - let immuneMon = false; - - for (const mon of attacker.side.active) { - if (this.runEvent('Immunity', mon, attacker, move)) { - immuneMon = true; - } + if (attacker.side.pokemonLeft === 1) { + this.add('-fail', attacker, 'move: Perish Song'); + this.hint("Self KO Clause: The last pokemon on a team cannot use moves that force fainting"); + return false; } - - for (const mon of attacker.side.foe.active) { - if (this.runEvent('Immunity', mon, attacker, move)) { - immuneMon = true; - } - } - - if (immuneMon) return; - - if (this.format.gameType === 'singles') { - if (attacker.side.pokemonLeft === 1 && attacker.side.foe.pokemonLeft === 1) { - return false; - } - } else if (this.format.gameType === 'doubles') { - if (attacker.side.pokemonLeft === 2 && attacker.side.foe.pokemonLeft === 2) { - return false; - } + }, + }, + destinybond: { + inherit: true, + onTryMove(attacker, defender, move) { + if (attacker.side.pokemonLeft === 1) { + this.add('-fail', attacker, 'move: Perish Song'); + this.hint("Self KO Clause: The last pokemon on a team cannot use moves that force fainting"); + return false; } }, }, diff --git a/data/mods/gen3colosseum/scripts.ts b/data/mods/gen3colosseum/scripts.ts index b5dd69344a..3e949ea8c7 100644 --- a/data/mods/gen3colosseum/scripts.ts +++ b/data/mods/gen3colosseum/scripts.ts @@ -4,8 +4,18 @@ export const Scripts: ModdedBattleScriptsData = { checkWin(faintData?: Battle['faintQueue'][0]) { if (this.sides.every(side => !side.pokemonLeft)) { - this.win(faintData ? faintData.target.side : null); - return true; + let isSelfKo = false; + if (faintData?.effect) { + isSelfKo = isSelfKo || this.dex.moves.getByID(faintData?.effect?.id).selfdestruct !== undefined; + isSelfKo = isSelfKo || this.dex.moves.getByID(faintData?.effect?.id).recoil !== undefined; + } + if (isSelfKo) { + this.win(faintData ? faintData.target.side : null); + return true; + } else { + this.win(undefined); + return true; + } } for (const side of this.sides) { if (!side.foePokemonLeft()) { diff --git a/data/mods/gen3frlg/abilities.ts b/data/mods/gen3frlg/abilities.ts new file mode 100644 index 0000000000..adfe8653b3 --- /dev/null +++ b/data/mods/gen3frlg/abilities.ts @@ -0,0 +1,63 @@ +function attemptStatuses(battle: Battle, target: Pokemon, source: Pokemon, move: ActiveMove, status: string) { + const attackerStatused = source.trySetStatus(status, target); + if (move.multihit && move.id !== 'triplekick' && + (move.lastHit || (attackerStatused && status === 'slp')) && + battle.randomChance(1, 100)) { + const defenderStatused = target.trySetStatus(status, target, move); + if (defenderStatused) { + battle.hint("In Pokemon Ruby, Sapphire, FireRed, LeafGreen, and Colosseum, if the final hit of a multihit move (except for Triple Kick) that makes contact triggers an ability that inflicts status, then there is a 1% chance that the defender is afflicted by the same status."); + } + } +} + +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { + effectspore: { + inherit: true, + onDamagingHit(damage, target, source, move) { + if (damage && move.flags['contact'] && !source.status) { + const r = this.random(300); + let status = null; + if (r < 10) { + status = 'slp'; + } else if (r < 20) { + status = 'par'; + } else if (r < 30) { + status = 'psn'; + } + if (status) { + attemptStatuses(this, target, source, move, status); + } + } + }, + }, + flamebody: { + inherit: true, + onDamagingHit(damage, target, source, move) { + if (damage && move.flags['contact']) { + if (this.randomChance(1, 3)) { + attemptStatuses(this, target, source, move, 'brn'); + } + } + }, + }, + poisonpoint: { + inherit: true, + onDamagingHit(damage, target, source, move) { + if (damage && move.flags['contact']) { + if (this.randomChance(1, 3)) { + attemptStatuses(this, target, source, move, 'psn'); + } + } + }, + }, + static: { + inherit: true, + onDamagingHit(damage, target, source, move) { + if (damage && move.flags['contact']) { + if (this.randomChance(1, 3)) { + attemptStatuses(this, target, source, move, 'par'); + } + } + }, + }, +}; diff --git a/data/mods/gen3frlg/formats-data.ts b/data/mods/gen3frlg/formats-data.ts new file mode 100644 index 0000000000..5b403df56a --- /dev/null +++ b/data/mods/gen3frlg/formats-data.ts @@ -0,0 +1,1354 @@ +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { + bulbasaur: { + tier: "LC", + }, + ivysaur: { + tier: "NFE", + }, + venusaur: { + tier: "OU", + }, + charmander: { + tier: "LC", + }, + charmeleon: { + tier: "NFE", + }, + charizard: { + tier: "OU", + }, + squirtle: { + tier: "LC", + }, + wartortle: { + tier: "NFE", + }, + blastoise: { + tier: "OU", + }, + caterpie: { + tier: "LC", + }, + metapod: { + tier: "NFE", + }, + butterfree: { + tier: "OU", + }, + weedle: { + tier: "LC", + }, + kakuna: { + tier: "NFE", + }, + beedrill: { + tier: "OU", + }, + pidgey: { + tier: "LC", + }, + pidgeotto: { + tier: "NFE", + }, + pidgeot: { + tier: "OU", + }, + rattata: { + tier: "LC", + }, + raticate: { + tier: "OU", + }, + spearow: { + tier: "LC", + }, + fearow: { + tier: "OU", + }, + ekans: { + tier: "LC", + }, + arbok: { + tier: "OU", + }, + pichu: { + tier: "LC", + }, + pikachu: { + tier: "NFE", + }, + raichu: { + tier: "OU", + }, + sandshrew: { + tier: "LC", + }, + sandslash: { + tier: "OU", + }, + nidoranf: { + tier: "LC", + }, + nidorina: { + tier: "NFE", + }, + nidoqueen: { + tier: "OU", + }, + nidoranm: { + tier: "LC", + }, + nidorino: { + tier: "NFE", + }, + nidoking: { + tier: "OU", + }, + cleffa: { + tier: "LC", + }, + clefairy: { + tier: "NFE", + }, + clefable: { + tier: "OU", + }, + vulpix: { + tier: "LC", + }, + ninetales: { + tier: "OU", + }, + igglybuff: { + tier: "LC", + }, + jigglypuff: { + tier: "NFE", + }, + wigglytuff: { + tier: "OU", + }, + zubat: { + tier: "LC", + }, + golbat: { + tier: "NFE", + }, + crobat: { + tier: "OU", + }, + oddish: { + tier: "LC", + }, + gloom: { + tier: "NFE", + }, + vileplume: { + tier: "OU", + }, + bellossom: { + tier: "OU", + }, + paras: { + tier: "LC", + }, + parasect: { + tier: "OU", + }, + venonat: { + tier: "LC", + }, + venomoth: { + tier: "OU", + }, + diglett: { + tier: "LC", + }, + dugtrio: { + tier: "OU", + }, + meowth: { + tier: "LC", + }, + persian: { + tier: "OU", + }, + psyduck: { + tier: "LC", + }, + golduck: { + tier: "OU", + }, + mankey: { + tier: "LC", + }, + primeape: { + tier: "OU", + }, + growlithe: { + tier: "LC", + }, + arcanine: { + tier: "OU", + }, + poliwag: { + tier: "LC", + }, + poliwhirl: { + tier: "NFE", + }, + poliwrath: { + tier: "OU", + }, + politoed: { + tier: "OU", + }, + abra: { + tier: "LC", + }, + kadabra: { + tier: "NFE", + }, + alakazam: { + tier: "OU", + }, + machop: { + tier: "LC", + }, + machoke: { + tier: "NFE", + }, + machamp: { + tier: "OU", + }, + bellsprout: { + tier: "LC", + }, + weepinbell: { + tier: "NFE", + }, + victreebel: { + tier: "OU", + }, + tentacool: { + tier: "LC", + }, + tentacruel: { + tier: "OU", + }, + geodude: { + tier: "LC", + }, + graveler: { + tier: "NFE", + }, + golem: { + tier: "OU", + }, + ponyta: { + tier: "LC", + }, + rapidash: { + tier: "OU", + }, + slowpoke: { + tier: "LC", + }, + slowbro: { + tier: "OU", + }, + slowking: { + tier: "OU", + }, + magnemite: { + tier: "LC", + }, + magneton: { + tier: "OU", + }, + farfetchd: { + tier: "OU", + }, + doduo: { + tier: "LC", + }, + dodrio: { + tier: "OU", + }, + seel: { + tier: "LC", + }, + dewgong: { + tier: "OU", + }, + grimer: { + tier: "LC", + }, + muk: { + tier: "OU", + }, + shellder: { + tier: "LC", + }, + cloyster: { + tier: "OU", + }, + gastly: { + tier: "LC", + }, + haunter: { + tier: "NFE", + }, + gengar: { + tier: "OU", + }, + onix: { + tier: "LC", + }, + steelix: { + tier: "OU", + }, + drowzee: { + tier: "LC", + }, + hypno: { + tier: "OU", + }, + krabby: { + tier: "LC", + }, + kingler: { + tier: "OU", + }, + voltorb: { + tier: "LC", + }, + electrode: { + tier: "OU", + }, + exeggcute: { + tier: "LC", + }, + exeggutor: { + tier: "OU", + }, + cubone: { + tier: "LC", + }, + marowak: { + tier: "OU", + }, + tyrogue: { + tier: "LC", + }, + hitmonlee: { + tier: "OU", + }, + hitmonchan: { + tier: "OU", + }, + hitmontop: { + tier: "OU", + }, + lickitung: { + tier: "OU", + }, + koffing: { + tier: "LC", + }, + weezing: { + tier: "OU", + }, + rhyhorn: { + tier: "LC", + }, + rhydon: { + tier: "OU", + }, + chansey: { + tier: "OU", + }, + blissey: { + tier: "OU", + }, + tangela: { + tier: "OU", + }, + kangaskhan: { + tier: "OU", + }, + horsea: { + tier: "LC", + }, + seadra: { + tier: "NFE", + }, + kingdra: { + tier: "OU", + }, + goldeen: { + tier: "LC", + }, + seaking: { + tier: "OU", + }, + staryu: { + tier: "LC", + }, + starmie: { + tier: "OU", + }, + mrmime: { + tier: "OU", + }, + scyther: { + tier: "OU", + }, + scizor: { + tier: "OU", + }, + smoochum: { + tier: "LC", + }, + jynx: { + tier: "OU", + }, + elekid: { + tier: "LC", + }, + electabuzz: { + tier: "OU", + }, + magby: { + tier: "LC", + }, + magmar: { + tier: "OU", + }, + pinsir: { + tier: "OU", + }, + tauros: { + tier: "OU", + }, + magikarp: { + tier: "LC", + }, + gyarados: { + tier: "OU", + }, + lapras: { + tier: "OU", + }, + ditto: { + tier: "OU", + }, + eevee: { + tier: "LC", + }, + vaporeon: { + tier: "OU", + }, + jolteon: { + tier: "OU", + }, + flareon: { + tier: "OU", + }, + espeon: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + umbreon: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + porygon: { + tier: "OU", + }, + porygon2: { + tier: "OU", + }, + omanyte: { + tier: "LC", + }, + omastar: { + tier: "OU", + }, + kabuto: { + tier: "LC", + }, + kabutops: { + tier: "OU", + }, + aerodactyl: { + tier: "OU", + }, + snorlax: { + tier: "OU", + }, + articuno: { + tier: "OU", + }, + zapdos: { + tier: "OU", + }, + moltres: { + tier: "OU", + }, + dratini: { + tier: "LC", + }, + dragonair: { + tier: "NFE", + }, + dragonite: { + tier: "OU", + }, + mewtwo: { + tier: "Uber", + }, + mew: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + chikorita: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + bayleef: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + meganium: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + cyndaquil: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + quilava: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + typhlosion: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + totodile: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + croconaw: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + feraligatr: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + sentret: { + tier: "LC", + }, + furret: { + tier: "OU", + }, + hoothoot: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + noctowl: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + ledyba: { + tier: "LC", + }, + ledian: { + tier: "OU", + }, + spinarak: { + tier: "LC", + }, + ariados: { + tier: "OU", + }, + chinchou: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + lanturn: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + togepi: { + tier: "LC", + }, + togetic: { + tier: "OU", + }, + natu: { + tier: "LC", + }, + xatu: { + tier: "OU", + }, + mareep: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + flaaffy: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + ampharos: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + azurill: { + tier: "LC", + }, + marill: { + tier: "NFE", + }, + azumarill: { + tier: "OU", + }, + sudowoodo: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + hoppip: { + tier: "LC", + }, + skiploom: { + tier: "NFE", + }, + jumpluff: { + tier: "OU", + }, + aipom: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + sunkern: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + sunflora: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + yanma: { + tier: "OU", + }, + wooper: { + tier: "LC", + }, + quagsire: { + tier: "OU", + }, + murkrow: { + tier: "OU", + }, + misdreavus: { + tier: "OU", + }, + unown: { + tier: "OU", + }, + wynaut: { + tier: "Uber", + }, + wobbuffet: { + tier: "Uber", + }, + girafarig: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + pineco: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + forretress: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + dunsparce: { + tier: "OU", + }, + gligar: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + snubbull: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + granbull: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + qwilfish: { + tier: "OU", + }, + shuckle: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + heracross: { + tier: "OU", + }, + sneasel: { + tier: "OU", + }, + teddiursa: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + ursaring: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + slugma: { + tier: "LC", + }, + magcargo: { + tier: "OU", + }, + swinub: { + tier: "LC", + }, + piloswine: { + tier: "OU", + }, + corsola: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + remoraid: { + tier: "LC", + }, + octillery: { + tier: "OU", + }, + delibird: { + tier: "OU", + }, + mantine: { + tier: "OU", + }, + skarmory: { + tier: "OU", + }, + houndour: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + houndoom: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + phanpy: { + tier: "LC", + }, + donphan: { + tier: "OU", + }, + stantler: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + smeargle: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + miltank: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + raikou: { + tier: "OU", + }, + entei: { + tier: "OU", + }, + suicune: { + tier: "OU", + }, + larvitar: { + tier: "LC", + }, + pupitar: { + tier: "NFE", + }, + tyranitar: { + tier: "OU", + }, + lugia: { + tier: "Uber", + }, + hooh: { + tier: "Uber", + }, + celebi: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + treecko: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + grovyle: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + sceptile: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + torchic: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + combusken: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + blaziken: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + mudkip: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + marshtomp: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + swampert: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + poochyena: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + mightyena: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + zigzagoon: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + linoone: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + wurmple: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + silcoon: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + beautifly: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + cascoon: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + dustox: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + lotad: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + lombre: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + ludicolo: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + seedot: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + nuzleaf: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + shiftry: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + taillow: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + swellow: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + wingull: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + pelipper: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + ralts: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + kirlia: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + gardevoir: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + surskit: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + masquerain: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + shroomish: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + breloom: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + slakoth: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + vigoroth: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + slaking: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + nincada: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + ninjask: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + shedinja: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + whismur: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + loudred: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + exploud: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + makuhita: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + hariyama: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + nosepass: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + skitty: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + delcatty: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + sableye: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + mawile: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + aron: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + lairon: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + aggron: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + meditite: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + medicham: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + electrike: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + manectric: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + plusle: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + minun: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + volbeat: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + illumise: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + roselia: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + gulpin: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + swalot: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + carvanha: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + sharpedo: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + wailmer: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + wailord: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + numel: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + camerupt: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + torkoal: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + spoink: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + grumpig: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + spinda: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + trapinch: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + vibrava: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + flygon: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + cacnea: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + cacturne: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + swablu: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + altaria: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + zangoose: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + seviper: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + lunatone: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + solrock: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + barboach: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + whiscash: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + corphish: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + crawdaunt: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + baltoy: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + claydol: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + lileep: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + cradily: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + anorith: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + armaldo: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + feebas: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + milotic: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + castform: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + castformsunny: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + castformrainy: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + castformsnowy: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + kecleon: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + shuppet: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + banette: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + duskull: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + dusclops: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + tropius: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + chimecho: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + absol: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + snorunt: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + glalie: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + spheal: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + sealeo: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + walrein: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + clamperl: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + huntail: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + gorebyss: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + relicanth: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + luvdisc: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + bagon: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + shelgon: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + salamence: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + beldum: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + metang: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + metagross: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + regirock: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + regice: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + registeel: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + latias: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + latios: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + kyogre: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + groudon: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + rayquaza: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + jirachi: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + deoxys: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, + deoxysattack: { + tier: "Uber", + }, + deoxysdefense: { + tier: "Uber", + }, + deoxysspeed: { + tier: "Unreleased", + isNonstandard: "Unobtainable", + }, +}; diff --git a/data/mods/gen3frlg/items.ts b/data/mods/gen3frlg/items.ts new file mode 100644 index 0000000000..02a3138aa6 --- /dev/null +++ b/data/mods/gen3frlg/items.ts @@ -0,0 +1,146 @@ +export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { + aguavberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + apicotberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + brightpowder: { + inherit: true, + isNonstandard: "Unobtainable", + }, + choiceband: { + inherit: true, + isNonstandard: "Unobtainable", + }, + clawfossil: { + inherit: true, + isNonstandard: "Unobtainable", + }, + cornnberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + deepseascale: { + inherit: true, + isNonstandard: "Unobtainable", + }, + deepseatooth: { + inherit: true, + isNonstandard: "Unobtainable", + }, + diveball: { + inherit: true, + isNonstandard: "Unobtainable", + }, + enigmaberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + figyberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + ganlonberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + grepaberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + hondewberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + kelpsyberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + lansatberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + liechiberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + lightball: { + inherit: true, + isNonstandard: "Unobtainable", + }, + magoberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + magostberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + mentalherb: { + inherit: true, + isNonstandard: "Unobtainable", + }, + nomelberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + petayaberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + pomegberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + premierball: { + inherit: true, + isNonstandard: "Unobtainable", + }, + qualotberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + rabutaberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + rootfossil: { + inherit: true, + isNonstandard: "Unobtainable", + }, + salacberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + scopelens: { + inherit: true, + isNonstandard: "Unobtainable", + }, + shellbell: { + inherit: true, + isNonstandard: "Unobtainable", + }, + souldew: { + inherit: true, + isNonstandard: "Unobtainable", + }, + starfberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + tamatoberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, + whiteherb: { + inherit: true, + isNonstandard: "Unobtainable", + }, + wikiberry: { + inherit: true, + isNonstandard: "Unobtainable", + }, +}; diff --git a/data/mods/gen3frlg/learnsets.ts b/data/mods/gen3frlg/learnsets.ts new file mode 100644 index 0000000000..efdd42881e --- /dev/null +++ b/data/mods/gen3frlg/learnsets.ts @@ -0,0 +1,9336 @@ +export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTable = { + bulbasaur: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + bulletseed: ["3M"], + curse: ["3E"], + cut: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + growl: ["3L4"], + growth: ["3L32"], + hiddenpower: ["3M"], + leechseed: ["3L7"], + lightscreen: ["3E"], + magicalleaf: ["3E"], + mimic: ["3T"], + petaldance: ["3E"], + poisonpowder: ["3L15"], + protect: ["3M"], + razorleaf: ["3L20"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + safeguard: ["3E"], + secretpower: ["3M"], + skullbash: ["3E"], + sleeppowder: ["3L15"], + sludgebomb: ["3M"], + solarbeam: ["3M", "3L46"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + sweetscent: ["3L25"], + swordsdance: ["3T"], + synthesis: ["3L39"], + tackle: ["3L1"], + toxic: ["3M"], + vinewhip: ["3L10"], + }, + }, + ivysaur: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + bulletseed: ["3M"], + cut: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + growl: ["3L1"], + growth: ["3L38"], + hiddenpower: ["3M"], + leechseed: ["3L1"], + mimic: ["3T"], + poisonpowder: ["3L15"], + protect: ["3M"], + razorleaf: ["3L22"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + secretpower: ["3M"], + sleeppowder: ["3L15"], + sludgebomb: ["3M"], + solarbeam: ["3M", "3L56"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + sweetscent: ["3L29"], + swordsdance: ["3T"], + synthesis: ["3L47"], + tackle: ["3L1"], + toxic: ["3M"], + vinewhip: ["3L10"], + }, + }, + venusaur: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + bulletseed: ["3M"], + cut: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + flash: ["3M"], + frenzyplant: ["3T"], + frustration: ["3M"], + gigadrain: ["3M"], + growl: ["3L1"], + growth: ["3L41"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + leechseed: ["3L1"], + mimic: ["3T"], + poisonpowder: ["3L15"], + protect: ["3M"], + razorleaf: ["3L22"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rocksmash: ["3M"], + secretpower: ["3M"], + sleeppowder: ["3L15"], + sludgebomb: ["3M"], + solarbeam: ["3M", "3L65"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + sweetscent: ["3L29"], + swordsdance: ["3T"], + synthesis: ["3L53"], + tackle: ["3L1"], + toxic: ["3M"], + vinewhip: ["3L1"], + }, + }, + charmander: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + beatup: ["3E"], + bellydrum: ["3E"], + bite: ["3E"], + bodyslam: ["3T"], + brickbreak: ["3M"], + counter: ["3T"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dragonclaw: ["3M"], + dragondance: ["3E"], + dragonrage: ["3L43"], + ember: ["3L7"], + facade: ["3M"], + fireblast: ["3M"], + firespin: ["3L49"], + flamethrower: ["3M", "3L31"], + focuspunch: ["3M"], + frustration: ["3M"], + growl: ["3L1"], + hiddenpower: ["3M"], + irontail: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + metalclaw: ["3L13"], + mimic: ["3T"], + outrage: ["3E"], + overheat: ["3M"], + protect: ["3M"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T", "3E"], + rocksmash: ["3M"], + scaryface: ["3L25"], + scratch: ["3L1"], + secretpower: ["3M"], + seismictoss: ["3T"], + slash: ["3L37"], + smokescreen: ["3L13"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swordsdance: ["3T", "3E"], + toxic: ["3M"], + }, + }, + charmeleon: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + counter: ["3T"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dragonclaw: ["3M"], + dragonrage: ["3L48"], + ember: ["3L1"], + facade: ["3M"], + fireblast: ["3M"], + firespin: ["3L55"], + flamethrower: ["3M", "3L34"], + focuspunch: ["3M"], + frustration: ["3M"], + growl: ["3L1"], + hiddenpower: ["3M"], + irontail: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + metalclaw: ["3L13"], + mimic: ["3T"], + overheat: ["3M"], + protect: ["3M"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + scaryface: ["3L27"], + scratch: ["3L1"], + secretpower: ["3M"], + seismictoss: ["3T"], + slash: ["3L41"], + smokescreen: ["3L13"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swordsdance: ["3T"], + toxic: ["3M"], + }, + }, + charizard: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + blastburn: ["3T"], + bodyslam: ["3T"], + brickbreak: ["3M"], + counter: ["3T"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dragonclaw: ["3M"], + dragonrage: ["3L54"], + earthquake: ["3M"], + ember: ["3L1"], + facade: ["3M"], + fireblast: ["3M"], + firespin: ["3L64"], + flamethrower: ["3M", "3L34"], + fly: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + growl: ["3L1"], + heatwave: ["3L1"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + irontail: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + metalclaw: ["3L1"], + mimic: ["3T"], + overheat: ["3M"], + protect: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + scaryface: ["3L27"], + scratch: ["3L1"], + secretpower: ["3M"], + seismictoss: ["3T"], + slash: ["3L44"], + smokescreen: ["3L1"], + steelwing: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swordsdance: ["3T"], + toxic: ["3M"], + wingattack: ["3L36"], + }, + }, + squirtle: { + learnset: { + attract: ["3M"], + bite: ["3L18"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + bubble: ["3L7"], + counter: ["3T"], + dig: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flail: ["3E"], + focuspunch: ["3M"], + frustration: ["3M"], + hail: ["3M"], + haze: ["3E"], + hiddenpower: ["3M"], + hydropump: ["3L47"], + icebeam: ["3M"], + irontail: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + mist: ["3E"], + protect: ["3M", "3L28"], + raindance: ["3M", "3L33"], + rapidspin: ["3L23"], + refresh: ["3E"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + skullbash: ["3L40"], + strength: ["3M"], + substitute: ["3T"], + surf: ["3M"], + tackle: ["3L1"], + tailwhip: ["3L4"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L13"], + waterpulse: ["3M"], + withdraw: ["3L10"], + yawn: ["3E"], + }, + }, + wartortle: { + learnset: { + attract: ["3M"], + bite: ["3L19"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + bubble: ["3L1"], + counter: ["3T"], + dig: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + hydropump: ["3L53"], + icebeam: ["3M"], + irontail: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + protect: ["3M", "3L31"], + raindance: ["3M", "3L37"], + rapidspin: ["3L25"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + skullbash: ["3L45"], + strength: ["3M"], + substitute: ["3T"], + surf: ["3M"], + tackle: ["3L1"], + tailwhip: ["3L1"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L13"], + waterpulse: ["3M"], + withdraw: ["3L10"], + }, + }, + blastoise: { + learnset: { + attract: ["3M"], + bite: ["3L19"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + bubble: ["3L1"], + counter: ["3T"], + dig: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + hydrocannon: ["3T"], + hydropump: ["3L68"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + protect: ["3M", "3L31"], + raindance: ["3M", "3L42"], + rapidspin: ["3L25"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rocksmash: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + skullbash: ["3L55"], + strength: ["3M"], + substitute: ["3T"], + surf: ["3M"], + tackle: ["3L1"], + tailwhip: ["3L1"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L13"], + waterpulse: ["3M"], + withdraw: ["3L1"], + }, + }, + caterpie: { + learnset: { + stringshot: ["3L1"], + tackle: ["3L1"], + }, + encounters: [ + {generation: 3, level: 3}, + ], + }, + metapod: { + learnset: { + harden: ["3L1"], + }, + encounters: [ + {generation: 3, level: 4}, + ], + }, + butterfree: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + confusion: ["3L1"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + gust: ["3L28"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + mimic: ["3T"], + poisonpowder: ["3L13"], + protect: ["3M"], + psybeam: ["3L34"], + psychic: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + safeguard: ["3M", "3L40"], + secretpower: ["3M"], + shadowball: ["3M"], + silverwind: ["3L47"], + skillswap: ["3M"], + sleeppowder: ["3L15"], + solarbeam: ["3M"], + stunspore: ["3L14"], + substitute: ["3T"], + sunnyday: ["3M"], + supersonic: ["3L18"], + thief: ["3M"], + toxic: ["3M"], + whirlwind: ["3L23"], + }, + }, + weedle: { + learnset: { + poisonsting: ["3L1"], + stringshot: ["3L1"], + }, + encounters: [ + {generation: 3, level: 3}, + ], + }, + kakuna: { + learnset: { + harden: ["3L1"], + }, + encounters: [ + {generation: 3, level: 4}, + ], + }, + beedrill: { + learnset: { + aerialace: ["3M"], + agility: ["3L40"], + attract: ["3M"], + brickbreak: ["3M"], + cut: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + endeavor: ["3L45"], + facade: ["3M"], + focusenergy: ["3L15"], + frustration: ["3M"], + furyattack: ["3L1"], + gigadrain: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + mimic: ["3T"], + pinmissile: ["3L35"], + protect: ["3M"], + pursuit: ["3L30"], + rage: ["3L25"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + secretpower: ["3M"], + sludgebomb: ["3M"], + solarbeam: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swordsdance: ["3T"], + thief: ["3M"], + toxic: ["3M"], + twineedle: ["3L20"], + }, + }, + pidgey: { + learnset: { + aerialace: ["3M"], + agility: ["3L39"], + aircutter: ["3E"], + attract: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + featherdance: ["3L31"], + feintattack: ["3E"], + fly: ["3M"], + frustration: ["3M"], + gust: ["3L9"], + hiddenpower: ["3M"], + mimic: ["3T"], + mirrormove: ["3L47"], + protect: ["3M"], + pursuit: ["3E"], + quickattack: ["3L13"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + sandattack: ["3L5"], + secretpower: ["3M"], + steelwing: ["3M", "3E"], + substitute: ["3T"], + sunnyday: ["3M"], + tackle: ["3L1"], + thief: ["3M"], + toxic: ["3M"], + whirlwind: ["3L19"], + wingattack: ["3L25"], + }, + encounters: [ + {generation: 3, level: 2}, + ], + }, + pidgeotto: { + learnset: { + aerialace: ["3M"], + agility: ["3L43"], + attract: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + featherdance: ["3L34"], + fly: ["3M"], + frustration: ["3M"], + gust: ["3L1"], + hiddenpower: ["3M"], + mimic: ["3T"], + mirrormove: ["3L52"], + protect: ["3M"], + quickattack: ["3L13"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + sandattack: ["3L1"], + secretpower: ["3M"], + steelwing: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + tackle: ["3L1"], + thief: ["3M"], + toxic: ["3M"], + whirlwind: ["3L20"], + wingattack: ["3L27"], + }, + encounters: [ + {generation: 3, level: 7}, + ], + }, + pidgeot: { + learnset: { + aerialace: ["3M"], + agility: ["3L48"], + attract: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + featherdance: ["3L34"], + fly: ["3M"], + frustration: ["3M"], + gust: ["3L1"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + mimic: ["3T"], + mirrormove: ["3L62"], + protect: ["3M"], + quickattack: ["3L1"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + sandattack: ["3L1"], + secretpower: ["3M"], + steelwing: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + tackle: ["3L1"], + thief: ["3M"], + toxic: ["3M"], + whirlwind: ["3L20"], + wingattack: ["3L27"], + }, + }, + rattata: { + learnset: { + attract: ["3M"], + bite: ["3E"], + blizzard: ["3M"], + bodyslam: ["3T"], + counter: ["3T", "3E"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + endeavor: ["3L41"], + facade: ["3M"], + flamewheel: ["3E"], + focusenergy: ["3L20"], + frustration: ["3M"], + furyswipes: ["3E"], + hiddenpower: ["3M"], + hyperfang: ["3L13"], + icebeam: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + protect: ["3M"], + pursuit: ["3L27"], + quickattack: ["3L7"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + screech: ["3E"], + secretpower: ["3M"], + shadowball: ["3M"], + shockwave: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + superfang: ["3L34"], + swagger: ["3E"], + tackle: ["3L1"], + tailwhip: ["3L1"], + taunt: ["3M"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + toxic: ["3M"], + }, + encounters: [ + {generation: 3, level: 2}, + ], + }, + raticate: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + counter: ["3T"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + endeavor: ["3L50"], + facade: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + hyperfang: ["3L13"], + icebeam: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + protect: ["3M"], + pursuit: ["3L30"], + quickattack: ["3L1"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rocksmash: ["3M"], + scaryface: ["3L20"], + secretpower: ["3M"], + shadowball: ["3M"], + shockwave: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + superfang: ["3L40"], + tackle: ["3L1"], + tailwhip: ["3L1"], + taunt: ["3M"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + toxic: ["3M"], + }, + }, + spearow: { + learnset: { + aerialace: ["3M", "3L25"], + agility: ["3L43"], + astonish: ["3E"], + attract: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + drillpeck: ["3L37"], + facade: ["3M"], + falseswipe: ["3E"], + feintattack: ["3E"], + fly: ["3M"], + frustration: ["3M"], + furyattack: ["3L13"], + growl: ["3L1"], + hiddenpower: ["3M"], + leer: ["3L7"], + mimic: ["3T"], + mirrormove: ["3L31"], + peck: ["3L1"], + protect: ["3M"], + pursuit: ["3L19"], + quickattack: ["3E"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + scaryface: ["3E"], + secretpower: ["3M"], + steelwing: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + thief: ["3M"], + toxic: ["3M"], + triattack: ["3E"], + }, + encounters: [ + {generation: 3, level: 3}, + ], + }, + fearow: { + learnset: { + aerialace: ["3M"], + agility: ["3L47"], + attract: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + drillpeck: ["3L40"], + facade: ["3M"], + fly: ["3M"], + frustration: ["3M"], + furyattack: ["3L1"], + growl: ["3L1"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + leer: ["3L1"], + mimic: ["3T"], + mirrormove: ["3L32"], + peck: ["3L1"], + protect: ["3M"], + pursuit: ["3L26"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + steelwing: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + thief: ["3M"], + toxic: ["3M"], + }, + }, + ekans: { + learnset: { + acid: ["3L32"], + attract: ["3M"], + beatup: ["3E"], + bite: ["3L13"], + bodyslam: ["3T"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + glare: ["3L20"], + haze: ["3L44"], + hiddenpower: ["3M"], + irontail: ["3M"], + leer: ["3L1"], + mimic: ["3T"], + poisonsting: ["3L8"], + protect: ["3M"], + pursuit: ["3E"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T"], + screech: ["3L25"], + secretpower: ["3M"], + slam: ["3E"], + sludgebomb: ["3M"], + snatch: ["3M"], + spite: ["3E"], + spitup: ["3L37"], + stockpile: ["3L37"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swallow: ["3L37"], + thief: ["3M"], + torment: ["3M"], + toxic: ["3M"], + wrap: ["3L1"], + }, + }, + arbok: { + learnset: { + acid: ["3L38"], + attract: ["3M"], + bite: ["3L1"], + bodyslam: ["3T"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + glare: ["3L20"], + haze: ["3L56"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + irontail: ["3M"], + leer: ["3L1"], + mimic: ["3T"], + poisonsting: ["3L1"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T"], + screech: ["3L28"], + secretpower: ["3M"], + sludgebomb: ["3M"], + snatch: ["3M"], + spitup: ["3L46"], + stockpile: ["3L46"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swallow: ["3L46"], + thief: ["3M"], + torment: ["3M"], + toxic: ["3M"], + wrap: ["3L1"], + }, + }, + pichu: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + charm: ["3L1"], + counter: ["3T"], + doubleedge: ["3T"], + doubleslap: ["3E"], + doubleteam: ["3M"], + encore: ["3E"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + irontail: ["3M"], + lightscreen: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + present: ["3E"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shockwave: ["3M"], + substitute: ["3T"], + sweetkiss: ["3L11"], + tailwhip: ["3L6"], + thunder: ["3M"], + thunderbolt: ["3M"], + thundershock: ["3L1"], + thunderwave: ["3T", "3L8"], + toxic: ["3M"], + wish: ["3E"], + }, + }, + pikachu: { + learnset: { + agility: ["3L33"], + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + counter: ["3T"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M", "3L15"], + facade: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + growl: ["3L1"], + hiddenpower: ["3M"], + irontail: ["3M"], + lightscreen: ["3M", "3L50"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + protect: ["3M"], + quickattack: ["3L11"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shockwave: ["3M"], + slam: ["3L20"], + strength: ["3M"], + substitute: ["3T"], + tailwhip: ["3L6"], + thunder: ["3M", "3L41"], + thunderbolt: ["3M", "3L26"], + thundershock: ["3L1"], + thunderwave: ["3T", "3L8"], + toxic: ["3M"], + }, + encounters: [ + {generation: 3, level: 3}, + ], + }, + raichu: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + counter: ["3T"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + irontail: ["3M"], + lightscreen: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + protect: ["3M"], + quickattack: ["3L1"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shockwave: ["3M"], + strength: ["3M"], + substitute: ["3T"], + tailwhip: ["3L1"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M", "3L1"], + thundershock: ["3L1"], + thunderwave: ["3T"], + toxic: ["3M"], + }, + }, + sandshrew: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + counter: ["3T", "3E"], + cut: ["3M"], + defensecurl: ["3T", "3L6"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + flail: ["3E"], + focuspunch: ["3M"], + frustration: ["3M"], + furyswipes: ["3L37"], + hiddenpower: ["3M"], + irontail: ["3M"], + metalclaw: ["3E"], + mimic: ["3T"], + poisonsting: ["3L17"], + protect: ["3M"], + rapidspin: ["3E"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T", "3E"], + rocksmash: ["3M"], + rocktomb: ["3M"], + safeguard: ["3E"], + sandattack: ["3L11"], + sandstorm: ["3M", "3L53"], + sandtomb: ["3L45"], + scratch: ["3L1"], + secretpower: ["3M"], + seismictoss: ["3T"], + slash: ["3L23"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swift: ["3T", "3L30"], + swordsdance: ["3T", "3E"], + thief: ["3M"], + toxic: ["3M"], + }, + }, + sandslash: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + counter: ["3T"], + cut: ["3M"], + defensecurl: ["3T", "3L1"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + furyswipes: ["3L42"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + poisonsting: ["3L17"], + protect: ["3M"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandattack: ["3L1"], + sandstorm: ["3M", "3L62"], + sandtomb: ["3L52"], + scratch: ["3L1"], + secretpower: ["3M"], + seismictoss: ["3T"], + slash: ["3L24"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swift: ["3T", "3L33"], + swordsdance: ["3T"], + thief: ["3M"], + toxic: ["3M"], + }, + }, + nidoranf: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + beatup: ["3E"], + bite: ["3L20"], + blizzard: ["3M"], + bodyslam: ["3T"], + charm: ["3E"], + counter: ["3T", "3E"], + crunch: ["3L47"], + cut: ["3M"], + dig: ["3M"], + disable: ["3E"], + doubleedge: ["3T"], + doublekick: ["3L12"], + doubleteam: ["3M"], + facade: ["3M"], + flatter: ["3L38"], + focusenergy: ["3E"], + frustration: ["3M"], + furyswipes: ["3L30"], + growl: ["3L1"], + helpinghand: ["3L23"], + hiddenpower: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + poisonsting: ["3L17"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + scratch: ["3L1"], + secretpower: ["3M"], + shockwave: ["3M"], + sludgebomb: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + supersonic: ["3E"], + tailwhip: ["3L8"], + takedown: ["3E"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + nidorina: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + bite: ["3L22"], + blizzard: ["3M"], + bodyslam: ["3T"], + counter: ["3T"], + crunch: ["3L53"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doublekick: ["3L12"], + doubleteam: ["3M"], + facade: ["3M"], + flatter: ["3L43"], + frustration: ["3M"], + furyswipes: ["3L34"], + growl: ["3L1"], + helpinghand: ["3L26"], + hiddenpower: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + poisonsting: ["3L18"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + scratch: ["3L1"], + secretpower: ["3M"], + shockwave: ["3M"], + sludgebomb: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + tailwhip: ["3L8"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + nidoqueen: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T", "3L22"], + brickbreak: ["3M"], + counter: ["3T"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doublekick: ["3L1"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + poisonsting: ["3L1"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandstorm: ["3M"], + scratch: ["3L1"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + sludgebomb: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + superpower: ["3L43"], + surf: ["3M"], + tailwhip: ["3L1"], + taunt: ["3M"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + torment: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + nidoranm: { + learnset: { + amnesia: ["3E"], + attract: ["3M"], + beatup: ["3E"], + blizzard: ["3M"], + bodyslam: ["3T"], + confusion: ["3E"], + counter: ["3T", "3E"], + cut: ["3M"], + dig: ["3M"], + disable: ["3E"], + doubleedge: ["3T"], + doublekick: ["3L12"], + doubleteam: ["3M"], + facade: ["3M"], + flatter: ["3L38"], + focusenergy: ["3L8"], + frustration: ["3M"], + furyattack: ["3L30"], + helpinghand: ["3L23"], + hiddenpower: ["3M"], + hornattack: ["3L20"], + horndrill: ["3L47"], + icebeam: ["3M"], + irontail: ["3M"], + leer: ["3L1"], + mimic: ["3T"], + peck: ["3L1"], + poisonsting: ["3L17"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + secretpower: ["3M"], + shockwave: ["3M"], + sludgebomb: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + supersonic: ["3E"], + takedown: ["3E"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + nidorino: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + counter: ["3T"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doublekick: ["3L12"], + doubleteam: ["3M"], + facade: ["3M"], + flatter: ["3L43"], + focusenergy: ["3L8"], + frustration: ["3M"], + furyattack: ["3L34"], + helpinghand: ["3L26"], + hiddenpower: ["3M"], + hornattack: ["3L22"], + horndrill: ["3L53"], + icebeam: ["3M"], + irontail: ["3M"], + leer: ["3L1"], + mimic: ["3T"], + peck: ["3L1"], + poisonsting: ["3L18"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + secretpower: ["3M"], + shockwave: ["3M"], + sludgebomb: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + nidoking: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + counter: ["3T"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doublekick: ["3L1"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + focusenergy: ["3L1"], + focuspunch: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + megahorn: ["3L43"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + peck: ["3L1"], + poisonsting: ["3L1"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandstorm: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + sludgebomb: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + surf: ["3M"], + taunt: ["3M"], + thief: ["3M"], + thrash: ["3L22"], + thunder: ["3M"], + thunderbolt: ["3M"], + torment: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + cleffa: { + learnset: { + amnesia: ["3E"], + attract: ["3M"], + bellydrum: ["3E"], + bodyslam: ["3T"], + charm: ["3L1"], + counter: ["3T"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + encore: ["3L4"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + flash: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + irontail: ["3M"], + lightscreen: ["3M"], + magicalleaf: ["3L17"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T", "3E"], + mimic: ["3T", "3E"], + pound: ["3L1"], + present: ["3E"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + safeguard: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + sing: ["3L8"], + softboiled: ["3T"], + solarbeam: ["3M"], + splash: ["3E"], + substitute: ["3T", "3E"], + sunnyday: ["3M"], + sweetkiss: ["3L13"], + thunderwave: ["3T"], + toxic: ["3M"], + waterpulse: ["3M"], + wish: ["3E"], + }, + }, + clefairy: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + calmmind: ["3M"], + cosmicpower: ["3L33"], + counter: ["3T"], + defensecurl: ["3T", "3L25"], + dig: ["3M"], + doubleedge: ["3T"], + doubleslap: ["3L13"], + doubleteam: ["3M"], + dreameater: ["3T"], + encore: ["3L5"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + followme: ["3L17"], + frustration: ["3M"], + growl: ["3L1"], + hiddenpower: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + lightscreen: ["3M", "3L41"], + megakick: ["3T"], + megapunch: ["3T"], + meteormash: ["3L45"], + metronome: ["3T", "3L29"], + mimic: ["3T"], + minimize: ["3L21"], + moonlight: ["3L37"], + pound: ["3L1"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + safeguard: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + sing: ["3L9"], + snatch: ["3M"], + softboiled: ["3T"], + solarbeam: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + clefable: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + calmmind: ["3M"], + counter: ["3T"], + dig: ["3M"], + doubleedge: ["3T"], + doubleslap: ["3L1"], + doubleteam: ["3M"], + dreameater: ["3T"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + lightscreen: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T", "3L1"], + mimic: ["3T"], + minimize: ["3L1"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + safeguard: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + sing: ["3L1"], + snatch: ["3M"], + softboiled: ["3T"], + solarbeam: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + vulpix: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + confuseray: ["3L21"], + dig: ["3M"], + disable: ["3E"], + doubleedge: ["3T"], + doubleteam: ["3M"], + ember: ["3L1"], + facade: ["3M"], + feintattack: ["3E"], + fireblast: ["3M"], + firespin: ["3L41"], + flail: ["3E"], + flamethrower: ["3M", "3L29"], + frustration: ["3M"], + grudge: ["3L37"], + hiddenpower: ["3M"], + hypnosis: ["3E"], + imprison: ["3L25"], + irontail: ["3M"], + mimic: ["3T"], + overheat: ["3M"], + protect: ["3M"], + psychup: ["3E"], + quickattack: ["3L13"], + rest: ["3M"], + return: ["3M"], + roar: ["3M", "3L9"], + safeguard: ["3M", "3L33"], + secretpower: ["3M"], + spite: ["3E"], + substitute: ["3T"], + sunnyday: ["3M"], + tailwhip: ["3L5"], + toxic: ["3M"], + willowisp: ["3L17"], + }, + }, + ninetales: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + confuseray: ["3L1"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + ember: ["3L1"], + facade: ["3M"], + fireblast: ["3M"], + firespin: ["3L45"], + flamethrower: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + overheat: ["3M"], + protect: ["3M"], + quickattack: ["3L1"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + safeguard: ["3M", "3L1"], + secretpower: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + toxic: ["3M"], + }, + }, + igglybuff: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + charm: ["3L1"], + counter: ["3T"], + defensecurl: ["3T", "3L4"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + flash: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + lightscreen: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + perishsong: ["3E"], + pound: ["3L9"], + present: ["3E"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + safeguard: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + sing: ["3L1"], + solarbeam: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + sweetkiss: ["3L14"], + thunderwave: ["3T"], + toxic: ["3M"], + waterpulse: ["3M"], + wish: ["3E"], + }, + }, + jigglypuff: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T", "3L34"], + brickbreak: ["3M"], + counter: ["3T"], + defensecurl: ["3T", "3L4"], + dig: ["3M"], + disable: ["3L14"], + doubleedge: ["3T", "3L49"], + doubleslap: ["3L24"], + doubleteam: ["3M"], + dreameater: ["3T"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hypervoice: ["3L44"], + icebeam: ["3M"], + lightscreen: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T", "3L39"], + pound: ["3L9"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M", "3L29"], + return: ["3M"], + rollout: ["3T", "3L19"], + safeguard: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + sing: ["3L1"], + snatch: ["3M"], + solarbeam: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + encounters: [ + {generation: 3, level: 3}, + ], + }, + wigglytuff: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + counter: ["3T"], + defensecurl: ["3T", "3L1"], + dig: ["3M"], + disable: ["3L1"], + doubleedge: ["3T"], + doubleslap: ["3L1"], + doubleteam: ["3M"], + dreameater: ["3T"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + lightscreen: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + safeguard: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + sing: ["3L1"], + snatch: ["3M"], + solarbeam: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + zubat: { + learnset: { + aerialace: ["3M"], + aircutter: ["3L31"], + astonish: ["3L6"], + attract: ["3M"], + bite: ["3L16"], + confuseray: ["3L26"], + curse: ["3E"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + feintattack: ["3E"], + frustration: ["3M"], + gigadrain: ["3M"], + gust: ["3E"], + haze: ["3L46"], + hiddenpower: ["3M"], + leechlife: ["3L1"], + meanlook: ["3L36"], + mimic: ["3T"], + poisonfang: ["3L41"], + protect: ["3M"], + pursuit: ["3E"], + quickattack: ["3E"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + shadowball: ["3M"], + sludgebomb: ["3M"], + snatch: ["3M"], + steelwing: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + supersonic: ["3L6"], + taunt: ["3M"], + thief: ["3M"], + torment: ["3M"], + toxic: ["3M"], + whirlwind: ["3E"], + wingattack: ["3L21"], + }, + }, + golbat: { + learnset: { + aerialace: ["3M"], + aircutter: ["3L35"], + astonish: ["3L1"], + attract: ["3M"], + bite: ["3L16"], + confuseray: ["3L28"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + haze: ["3L56"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + leechlife: ["3L1"], + meanlook: ["3L42"], + mimic: ["3T"], + poisonfang: ["3L49"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + screech: ["3L1"], + secretpower: ["3M"], + shadowball: ["3M"], + sludgebomb: ["3M"], + snatch: ["3M"], + steelwing: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + supersonic: ["3L1"], + taunt: ["3M"], + thief: ["3M"], + torment: ["3M"], + toxic: ["3M"], + wingattack: ["3L21"], + }, + encounters: [ + {generation: 3, level: 5}, + ], + }, + crobat: { + learnset: { + aerialace: ["3M"], + aircutter: ["3L35"], + astonish: ["3L1"], + attract: ["3M"], + bite: ["3L16"], + confuseray: ["3L28"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + fly: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + haze: ["3L56"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + leechlife: ["3L1"], + meanlook: ["3L42"], + mimic: ["3T"], + poisonfang: ["3L49"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + screech: ["3L1"], + secretpower: ["3M"], + shadowball: ["3M"], + sludgebomb: ["3M"], + snatch: ["3M"], + steelwing: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + supersonic: ["3L1"], + taunt: ["3M"], + thief: ["3M"], + torment: ["3M"], + toxic: ["3M"], + wingattack: ["3L21"], + }, + }, + oddish: { + learnset: { + absorb: ["3L1"], + acid: ["3L23"], + attract: ["3M"], + bulletseed: ["3M"], + cut: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + hiddenpower: ["3M"], + ingrain: ["3E"], + mimic: ["3T"], + moonlight: ["3L32"], + petaldance: ["3L39"], + poisonpowder: ["3L14"], + protect: ["3M"], + razorleaf: ["3E"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + sleeppowder: ["3L18"], + sludgebomb: ["3M"], + solarbeam: ["3M"], + stunspore: ["3L16"], + substitute: ["3T"], + sunnyday: ["3M"], + sweetscent: ["3L7"], + swordsdance: ["3T", "3E"], + synthesis: ["3E"], + toxic: ["3M"], + }, + }, + gloom: { + learnset: { + absorb: ["3L1"], + acid: ["3L24"], + attract: ["3M"], + bulletseed: ["3M"], + cut: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + hiddenpower: ["3M"], + mimic: ["3T"], + moonlight: ["3L35"], + petaldance: ["3L44"], + poisonpowder: ["3L1"], + protect: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + sleeppowder: ["3L18"], + sludgebomb: ["3M"], + solarbeam: ["3M"], + stunspore: ["3L16"], + substitute: ["3T"], + sunnyday: ["3M"], + sweetscent: ["3L1"], + swordsdance: ["3T"], + toxic: ["3M"], + }, + }, + vileplume: { + learnset: { + absorb: ["3L1"], + aromatherapy: ["3L1"], + attract: ["3M"], + bodyslam: ["3T"], + bulletseed: ["3M"], + cut: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + megadrain: ["3L1"], + mimic: ["3T"], + petaldance: ["3L44"], + protect: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + sludgebomb: ["3M"], + solarbeam: ["3M"], + stunspore: ["3L1"], + substitute: ["3T"], + sunnyday: ["3M"], + swordsdance: ["3T"], + toxic: ["3M"], + }, + }, + bellossom: { + learnset: { + absorb: ["3L1"], + attract: ["3M"], + bulletseed: ["3M"], + cut: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + magicalleaf: ["3L1"], + mimic: ["3T"], + petaldance: ["3L44"], + protect: ["3M"], + rest: ["3M"], + return: ["3M"], + safeguard: ["3M"], + secretpower: ["3M"], + sludgebomb: ["3M"], + solarbeam: ["3M", "3L55"], + stunspore: ["3L1"], + substitute: ["3T"], + sunnyday: ["3M"], + sweetscent: ["3L1"], + swordsdance: ["3T"], + toxic: ["3M"], + }, + }, + paras: { + learnset: { + aerialace: ["3M"], + aromatherapy: ["3L49"], + attract: ["3M"], + bodyslam: ["3T"], + bulletseed: ["3M"], + counter: ["3T", "3E"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + falseswipe: ["3E"], + flash: ["3M"], + frustration: ["3M"], + gigadrain: ["3M", "3L43"], + growth: ["3L37"], + hiddenpower: ["3M"], + leechlife: ["3L19"], + lightscreen: ["3E"], + mimic: ["3T"], + poisonpowder: ["3L13"], + protect: ["3M"], + psybeam: ["3E"], + pursuit: ["3E"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + scratch: ["3L1"], + screech: ["3E"], + secretpower: ["3M"], + slash: ["3L31"], + sludgebomb: ["3M"], + solarbeam: ["3M"], + spore: ["3L25"], + stunspore: ["3L7"], + substitute: ["3T"], + sunnyday: ["3M"], + sweetscent: ["3E"], + swordsdance: ["3T"], + thief: ["3M"], + toxic: ["3M"], + }, + }, + parasect: { + learnset: { + aerialace: ["3M"], + aromatherapy: ["3L59"], + attract: ["3M"], + bodyslam: ["3T"], + bulletseed: ["3M"], + counter: ["3T"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + gigadrain: ["3M", "3L51"], + growth: ["3L43"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + leechlife: ["3L19"], + mimic: ["3T"], + poisonpowder: ["3L1"], + protect: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + scratch: ["3L1"], + secretpower: ["3M"], + slash: ["3L35"], + sludgebomb: ["3M"], + solarbeam: ["3M"], + spore: ["3L27"], + stunspore: ["3L1"], + substitute: ["3T"], + sunnyday: ["3M"], + swordsdance: ["3T"], + thief: ["3M"], + toxic: ["3M"], + }, + }, + venonat: { + learnset: { + attract: ["3M"], + batonpass: ["3E"], + confusion: ["3L17"], + disable: ["3L1"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + foresight: ["3L1"], + frustration: ["3M"], + gigadrain: ["3M", "3E"], + hiddenpower: ["3M"], + leechlife: ["3L25"], + mimic: ["3T"], + poisonpowder: ["3L20"], + protect: ["3M"], + psybeam: ["3L33"], + psychic: ["3M", "3L41"], + rest: ["3M"], + return: ["3M"], + screech: ["3E"], + secretpower: ["3M"], + skillswap: ["3M"], + sleeppowder: ["3L36"], + sludgebomb: ["3M"], + solarbeam: ["3M"], + stunspore: ["3L28"], + substitute: ["3T"], + sunnyday: ["3M"], + supersonic: ["3L9"], + tackle: ["3L1"], + thief: ["3M"], + toxic: ["3M"], + }, + }, + venomoth: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + confusion: ["3L17"], + disable: ["3L1"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + foresight: ["3L1"], + frustration: ["3M"], + gigadrain: ["3M"], + gust: ["3L31"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + leechlife: ["3L25"], + mimic: ["3T"], + poisonpowder: ["3L20"], + protect: ["3M"], + psybeam: ["3L36"], + psychic: ["3M", "3L52"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + silverwind: ["3L1"], + skillswap: ["3M"], + sleeppowder: ["3L42"], + sludgebomb: ["3M"], + solarbeam: ["3M"], + stunspore: ["3L28"], + substitute: ["3T"], + sunnyday: ["3M"], + supersonic: ["3L1"], + tackle: ["3L1"], + thief: ["3M"], + toxic: ["3M"], + }, + }, + diglett: { + learnset: { + aerialace: ["3M"], + ancientpower: ["3E"], + attract: ["3M"], + beatup: ["3E"], + bodyslam: ["3T"], + cut: ["3M"], + dig: ["3M", "3L17"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M", "3L41"], + facade: ["3M"], + feintattack: ["3E"], + fissure: ["3L49"], + frustration: ["3M"], + furyswipes: ["3L21"], + growl: ["3L5"], + hiddenpower: ["3M"], + magnitude: ["3L9"], + mimic: ["3T"], + mudslap: ["3T", "3L25"], + protect: ["3M"], + pursuit: ["3E"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T", "3E"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandattack: ["3L1"], + scratch: ["3L1"], + screech: ["3E"], + secretpower: ["3M"], + slash: ["3L33"], + sludgebomb: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + thief: ["3M"], + toxic: ["3M"], + }, + }, + dugtrio: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + bodyslam: ["3T"], + cut: ["3M"], + dig: ["3M", "3L17"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M", "3L51"], + facade: ["3M"], + fissure: ["3L64"], + frustration: ["3M"], + furyswipes: ["3L21"], + growl: ["3L1"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + magnitude: ["3L9"], + mimic: ["3T"], + mudslap: ["3T", "3L25"], + protect: ["3M"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandattack: ["3L1"], + sandtomb: ["3L26"], + scratch: ["3L1"], + secretpower: ["3M"], + slash: ["3L38"], + sludgebomb: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + thief: ["3M"], + toxic: ["3M"], + triattack: ["3L1"], + }, + }, + meowth: { + learnset: { + aerialace: ["3M"], + amnesia: ["3E"], + attract: ["3M"], + bite: ["3L10"], + bodyslam: ["3T"], + charm: ["3E"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + facade: ["3M"], + fakeout: ["3L43"], + feintattack: ["3L25"], + flash: ["3M"], + frustration: ["3M"], + furyswipes: ["3L36"], + growl: ["3L1"], + hiddenpower: ["3M"], + hypnosis: ["3E"], + irontail: ["3M"], + mimic: ["3T"], + payday: ["3L18"], + protect: ["3M"], + psychup: ["3T", "3E"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + scratch: ["3L1"], + screech: ["3L31"], + secretpower: ["3M"], + shadowball: ["3M"], + shockwave: ["3M"], + slash: ["3L40"], + snatch: ["3M"], + spite: ["3E"], + substitute: ["3T"], + sunnyday: ["3M"], + swagger: ["3T", "3L45"], + taunt: ["3M"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + torment: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + encounters: [ + {generation: 3, level: 3, gender: "M", nature: "Naive", ivs: {hp: 4, atk: 5, def: 4, spa: 5, spd: 4, spe: 4}, abilities: ["pickup"], pokeball: "pokeball"}, + ], + }, + persian: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + bite: ["3L1"], + bodyslam: ["3T"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + facade: ["3M"], + fakeout: ["3L55"], + feintattack: ["3L25"], + flash: ["3M"], + frustration: ["3M"], + furyswipes: ["3L42"], + growl: ["3L1"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + payday: ["3L18"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + scratch: ["3L1"], + screech: ["3L34"], + secretpower: ["3M"], + shadowball: ["3M"], + shockwave: ["3M"], + slash: ["3L49"], + snatch: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swagger: ["3T", "3L61"], + taunt: ["3M"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + torment: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + psyduck: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + calmmind: ["3M"], + confusion: ["3L16"], + counter: ["3T"], + crosschop: ["3E"], + dig: ["3M"], + disable: ["3L10"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + furyswipes: ["3L40"], + hail: ["3M"], + hiddenpower: ["3M"], + hydropump: ["3L50"], + hypnosis: ["3E"], + icebeam: ["3M"], + irontail: ["3M"], + lightscreen: ["3E"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + protect: ["3M"], + psybeam: ["3E"], + psychic: ["3E"], + psychup: ["3T", "3L31"], + raindance: ["3M"], + refresh: ["3E"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + scratch: ["3L1"], + screech: ["3L23"], + secretpower: ["3M"], + seismictoss: ["3T"], + strength: ["3M"], + substitute: ["3T"], + surf: ["3M"], + tailwhip: ["3L5"], + toxic: ["3M"], + waterfall: ["3M"], + waterpulse: ["3M"], + watersport: ["3L1"], + }, + }, + golduck: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + calmmind: ["3M"], + confusion: ["3L16"], + counter: ["3T"], + dig: ["3M"], + disable: ["3L1"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + furyswipes: ["3L44"], + hail: ["3M"], + hiddenpower: ["3M"], + hydropump: ["3L58"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + protect: ["3M"], + psychup: ["3T", "3L31"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + scratch: ["3L1"], + screech: ["3L23"], + secretpower: ["3M"], + seismictoss: ["3T"], + strength: ["3M"], + substitute: ["3T"], + surf: ["3M"], + tailwhip: ["3L1"], + toxic: ["3M"], + waterfall: ["3M"], + waterpulse: ["3M"], + watersport: ["3L1"], + }, + encounters: [ + {generation: 3, level: 25, pokeball: "safariball"}, + ], + }, + mankey: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + beatup: ["3E"], + bodyslam: ["3T"], + brickbreak: ["3M"], + bulkup: ["3M"], + counter: ["3T", "3E"], + crosschop: ["3L31"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + focusenergy: ["3L21"], + focuspunch: ["3M"], + frustration: ["3M"], + furyswipes: ["3L16"], + hiddenpower: ["3M"], + irontail: ["3M"], + karatechop: ["3L11"], + leer: ["3L1"], + lowkick: ["3L6"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + overheat: ["3M"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T", "3E"], + rocksmash: ["3M"], + rocktomb: ["3M"], + scratch: ["3L1"], + screech: ["3L41"], + secretpower: ["3M"], + seismictoss: ["3T", "3L26"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swagger: ["3T", "3L36"], + taunt: ["3M"], + thief: ["3M"], + thrash: ["3L46"], + thunder: ["3M"], + thunderbolt: ["3M"], + toxic: ["3M"], + }, + encounters: [ + {generation: 3, level: 2}, + ], + }, + primeape: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + bulkup: ["3M"], + counter: ["3T"], + crosschop: ["3L35"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + focusenergy: ["3L21"], + focuspunch: ["3M"], + frustration: ["3M"], + furyswipes: ["3L16"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + irontail: ["3M"], + karatechop: ["3L11"], + leer: ["3L1"], + lowkick: ["3L1"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + overheat: ["3M"], + protect: ["3M"], + rage: ["3L1"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + scratch: ["3L1"], + screech: ["3L53"], + secretpower: ["3M"], + seismictoss: ["3T", "3L26"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swagger: ["3T", "3L44"], + taunt: ["3M"], + thief: ["3M"], + thrash: ["3L62"], + thunder: ["3M"], + thunderbolt: ["3M"], + toxic: ["3M"], + }, + }, + growlithe: { + learnset: { + aerialace: ["3M"], + agility: ["3L43"], + attract: ["3M"], + bite: ["3L1"], + bodyslam: ["3T", "3E"], + crunch: ["3E"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + ember: ["3L7"], + facade: ["3M"], + fireblast: ["3M"], + firespin: ["3E"], + flamethrower: ["3M", "3L49"], + flamewheel: ["3L31"], + frustration: ["3M"], + helpinghand: ["3L37"], + hiddenpower: ["3M"], + irontail: ["3M"], + leer: ["3L13"], + mimic: ["3T"], + odorsleuth: ["3L19"], + overheat: ["3M"], + protect: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M", "3L1"], + rocksmash: ["3M"], + safeguard: ["3E"], + secretpower: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + takedown: ["3L25"], + thief: ["3M"], + thrash: ["3E"], + toxic: ["3M"], + }, + }, + arcanine: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + bite: ["3L1"], + bodyslam: ["3T"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + ember: ["3L1"], + extremespeed: ["3L49"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + odorsleuth: ["3L1"], + overheat: ["3M"], + protect: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M", "3L1"], + rocksmash: ["3M"], + secretpower: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + thief: ["3M"], + toxic: ["3M"], + }, + }, + poliwag: { + learnset: { + attract: ["3M"], + bellydrum: ["3L37"], + blizzard: ["3M"], + bodyslam: ["3T", "3L31"], + bubble: ["3L1"], + bubblebeam: ["3E"], + dig: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleslap: ["3L19"], + doubleteam: ["3M"], + facade: ["3M"], + frustration: ["3M"], + hail: ["3M"], + haze: ["3E"], + hiddenpower: ["3M"], + hydropump: ["3L43"], + hypnosis: ["3L7"], + icebeam: ["3M"], + mimic: ["3T"], + mindreader: ["3E"], + mist: ["3E"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M", "3L25"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + splash: ["3E"], + substitute: ["3T"], + surf: ["3M"], + thief: ["3M"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L13"], + waterpulse: ["3M"], + watersport: ["3E"], + }, + }, + poliwhirl: { + learnset: { + attract: ["3M"], + bellydrum: ["3L43"], + blizzard: ["3M"], + bodyslam: ["3T", "3L35"], + brickbreak: ["3M"], + bubble: ["3L1"], + counter: ["3T"], + dig: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleslap: ["3L19"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + hydropump: ["3L51"], + hypnosis: ["3L1"], + icebeam: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M", "3L27"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + strength: ["3M"], + substitute: ["3T"], + surf: ["3M"], + thief: ["3M"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L1"], + waterpulse: ["3M"], + }, + encounters: [ + {generation: 3, level: 20}, + ], + }, + poliwrath: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + bulkup: ["3M"], + counter: ["3T"], + dig: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleslap: ["3L1"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + hypnosis: ["3L1"], + icebeam: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + mindreader: ["3L51"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + rocktomb: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + strength: ["3M"], + submission: ["3L1"], + substitute: ["3T"], + surf: ["3M"], + thief: ["3M"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L1"], + waterpulse: ["3M"], + }, + }, + politoed: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + counter: ["3T"], + dig: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleslap: ["3L1"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + hypnosis: ["3L1"], + icebeam: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + perishsong: ["3L1"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + strength: ["3M"], + substitute: ["3T"], + surf: ["3M"], + swagger: ["3T", "3L51"], + thief: ["3M"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L1"], + waterpulse: ["3M"], + }, + }, + abra: { + learnset: { + attract: ["3M"], + barrier: ["3E"], + bodyslam: ["3T"], + calmmind: ["3M"], + counter: ["3T"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + encore: ["3E"], + facade: ["3M"], + firepunch: ["3T", "3E"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + icepunch: ["3T", "3E"], + irontail: ["3M"], + lightscreen: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + safeguard: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + skillswap: ["3M"], + snatch: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + taunt: ["3M"], + teleport: ["3L1"], + thief: ["3M"], + thunderpunch: ["3T", "3E"], + thunderwave: ["3T"], + torment: ["3M"], + toxic: ["3M"], + }, + }, + kadabra: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + calmmind: ["3M"], + confusion: ["3L1"], + counter: ["3T"], + disable: ["3L18"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + facade: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + futuresight: ["3L30"], + hiddenpower: ["3M"], + irontail: ["3M"], + kinesis: ["3L1"], + lightscreen: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + protect: ["3M"], + psybeam: ["3L21"], + psychic: ["3M", "3L36"], + raindance: ["3M"], + recover: ["3L25"], + reflect: ["3M", "3L23"], + rest: ["3M"], + return: ["3M"], + roleplay: ["3L33"], + safeguard: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + skillswap: ["3M"], + snatch: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + taunt: ["3M"], + teleport: ["3L1"], + thief: ["3M"], + thunderwave: ["3T"], + torment: ["3M"], + toxic: ["3M"], + trick: ["3L43"], + }, + }, + alakazam: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + calmmind: ["3M", "3L33"], + confusion: ["3L1"], + counter: ["3T"], + disable: ["3L18"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + facade: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + futuresight: ["3L30"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + irontail: ["3M"], + kinesis: ["3L1"], + lightscreen: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + protect: ["3M"], + psybeam: ["3L21"], + psychic: ["3M", "3L36"], + raindance: ["3M"], + recover: ["3L25"], + reflect: ["3M", "3L23"], + rest: ["3M"], + return: ["3M"], + safeguard: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + skillswap: ["3M"], + snatch: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + taunt: ["3M"], + teleport: ["3L1"], + thief: ["3M"], + thunderwave: ["3T"], + torment: ["3M"], + toxic: ["3M"], + trick: ["3L43"], + }, + }, + machop: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + bulkup: ["3M"], + counter: ["3T", "3E"], + crosschop: ["3L40"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dynamicpunch: ["3T", "3L49"], + earthquake: ["3M"], + encore: ["3E"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + focusenergy: ["3L7"], + focuspunch: ["3M"], + foresight: ["3L22"], + frustration: ["3M"], + hiddenpower: ["3M"], + karatechop: ["3L13"], + leer: ["3L1"], + lightscreen: ["3E"], + lowkick: ["3L1"], + meditate: ["3E"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + revenge: ["3L25"], + rockslide: ["3T", "3E"], + rocksmash: ["3M"], + rocktomb: ["3M"], + rollingkick: ["3E"], + scaryface: ["3L43"], + secretpower: ["3M"], + seismictoss: ["3T", "3L19"], + strength: ["3M"], + submission: ["3L37"], + substitute: ["3T"], + sunnyday: ["3M"], + thief: ["3M"], + toxic: ["3M"], + vitalthrow: ["3L31"], + }, + }, + machoke: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + bulkup: ["3M"], + counter: ["3T"], + crosschop: ["3L46"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dynamicpunch: ["3T", "3L59"], + earthquake: ["3M"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + focusenergy: ["3L1"], + focuspunch: ["3M"], + foresight: ["3L22"], + frustration: ["3M"], + hiddenpower: ["3M"], + karatechop: ["3L13"], + leer: ["3L1"], + lowkick: ["3L1"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + revenge: ["3L25"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + scaryface: ["3L51"], + secretpower: ["3M"], + seismictoss: ["3T", "3L19"], + strength: ["3M"], + submission: ["3L41"], + substitute: ["3T"], + sunnyday: ["3M"], + thief: ["3M"], + toxic: ["3M"], + vitalthrow: ["3L33"], + }, + }, + machamp: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + bulkup: ["3M"], + counter: ["3T"], + crosschop: ["3L46"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dynamicpunch: ["3T", "3L59"], + earthquake: ["3M"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + focusenergy: ["3L1"], + focuspunch: ["3M"], + foresight: ["3L22"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + karatechop: ["3L13"], + leer: ["3L1"], + lowkick: ["3L1"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + revenge: ["3L25"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + scaryface: ["3L51"], + secretpower: ["3M"], + seismictoss: ["3T", "3L19"], + strength: ["3M"], + submission: ["3L41"], + substitute: ["3T"], + sunnyday: ["3M"], + thief: ["3M"], + toxic: ["3M"], + vitalthrow: ["3L33"], + }, + }, + bellsprout: { + learnset: { + acid: ["3L23"], + attract: ["3M"], + bulletseed: ["3M"], + cut: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + encore: ["3E"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + growth: ["3L6"], + hiddenpower: ["3M"], + ingrain: ["3E"], + leechlife: ["3E"], + magicalleaf: ["3E"], + mimic: ["3T"], + poisonpowder: ["3L17"], + protect: ["3M"], + razorleaf: ["3L37"], + reflect: ["3E"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + slam: ["3L45"], + sleeppowder: ["3L15"], + sludgebomb: ["3M"], + solarbeam: ["3M"], + stunspore: ["3L19"], + substitute: ["3T"], + sunnyday: ["3M"], + sweetscent: ["3L30"], + swordsdance: ["3T", "3E"], + synthesis: ["3E"], + thief: ["3M"], + toxic: ["3M"], + vinewhip: ["3L1"], + wrap: ["3L11"], + }, + }, + weepinbell: { + learnset: { + acid: ["3L24"], + attract: ["3M"], + bulletseed: ["3M"], + cut: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + growth: ["3L1"], + hiddenpower: ["3M"], + mimic: ["3T"], + poisonpowder: ["3L17"], + protect: ["3M"], + razorleaf: ["3L42"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + slam: ["3L54"], + sleeppowder: ["3L15"], + sludgebomb: ["3M"], + solarbeam: ["3M"], + stunspore: ["3L19"], + substitute: ["3T"], + sunnyday: ["3M"], + sweetscent: ["3L33"], + swordsdance: ["3T"], + thief: ["3M"], + toxic: ["3M"], + vinewhip: ["3L1"], + wrap: ["3L1"], + }, + }, + victreebel: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + bulletseed: ["3M"], + cut: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + mimic: ["3T"], + protect: ["3M"], + razorleaf: ["3L1"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + sleeppowder: ["3L1"], + sludgebomb: ["3M"], + solarbeam: ["3M"], + spitup: ["3L1"], + stockpile: ["3L1"], + substitute: ["3T"], + sunnyday: ["3M"], + swallow: ["3L1"], + sweetscent: ["3L1"], + swordsdance: ["3T"], + thief: ["3M"], + toxic: ["3M"], + vinewhip: ["3L1"], + }, + }, + tentacool: { + learnset: { + acid: ["3L19"], + attract: ["3M"], + aurorabeam: ["3E"], + barrier: ["3L36"], + blizzard: ["3M"], + bubblebeam: ["3L25"], + confuseray: ["3E"], + constrict: ["3L12"], + cut: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + hail: ["3M"], + haze: ["3E"], + hiddenpower: ["3M"], + hydropump: ["3L49"], + icebeam: ["3M"], + mimic: ["3T"], + poisonsting: ["3L1"], + protect: ["3M"], + raindance: ["3M"], + rapidspin: ["3E"], + rest: ["3M"], + return: ["3M"], + screech: ["3L43"], + secretpower: ["3M"], + sludgebomb: ["3M"], + substitute: ["3T"], + supersonic: ["3L6"], + surf: ["3M"], + swordsdance: ["3T"], + thief: ["3M"], + toxic: ["3M"], + waterfall: ["3M"], + waterpulse: ["3M"], + wrap: ["3L30"], + }, + }, + tentacruel: { + learnset: { + acid: ["3L19"], + attract: ["3M"], + barrier: ["3L38"], + blizzard: ["3M"], + bubblebeam: ["3L25"], + constrict: ["3L1"], + cut: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + hydropump: ["3L55"], + hyperbeam: ["3M"], + icebeam: ["3M"], + mimic: ["3T"], + poisonsting: ["3L1"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + screech: ["3L47"], + secretpower: ["3M"], + sludgebomb: ["3M"], + substitute: ["3T"], + supersonic: ["3L1"], + surf: ["3M"], + swordsdance: ["3T"], + thief: ["3M"], + toxic: ["3M"], + waterfall: ["3M"], + waterpulse: ["3M"], + wrap: ["3L30"], + }, + encounters: [ + {generation: 3, level: 20}, + ], + }, + geodude: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + counter: ["3T"], + defensecurl: ["3T", "3L1"], + dig: ["3M"], + doubleedge: ["3T", "3L46"], + doubleteam: ["3M"], + earthquake: ["3M", "3L36"], + explosion: ["3T", "3L41"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + magnitude: ["3L16"], + megapunch: ["3T", "3E"], + metronome: ["3T"], + mimic: ["3T"], + mudsport: ["3L6"], + protect: ["3M"], + rest: ["3M"], + return: ["3M"], + rockblast: ["3L31"], + rockslide: ["3T", "3E"], + rocksmash: ["3M"], + rockthrow: ["3L11"], + rocktomb: ["3M"], + rollout: ["3T", "3L26"], + sandstorm: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + selfdestruct: ["3T", "3L21"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + tackle: ["3L1"], + toxic: ["3M"], + }, + }, + graveler: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + counter: ["3T"], + defensecurl: ["3T", "3L1"], + dig: ["3M"], + doubleedge: ["3T", "3L62"], + doubleteam: ["3M"], + earthquake: ["3M", "3L45"], + explosion: ["3T", "3L53"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + magnitude: ["3L16"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + mudsport: ["3L1"], + protect: ["3M"], + rest: ["3M"], + return: ["3M"], + rockblast: ["3L37"], + rockslide: ["3T"], + rocksmash: ["3M"], + rockthrow: ["3L1"], + rocktomb: ["3M"], + rollout: ["3T", "3L29"], + sandstorm: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + selfdestruct: ["3T", "3L21"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + tackle: ["3L1"], + toxic: ["3M"], + }, + }, + golem: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + counter: ["3T"], + defensecurl: ["3T", "3L1"], + dig: ["3M"], + doubleedge: ["3T", "3L62"], + doubleteam: ["3M"], + earthquake: ["3M", "3L45"], + explosion: ["3T", "3L53"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + magnitude: ["3L16"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + mudsport: ["3L1"], + protect: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rockblast: ["3L37"], + rockslide: ["3T"], + rocksmash: ["3M"], + rockthrow: ["3L1"], + rocktomb: ["3M"], + rollout: ["3T", "3L29"], + sandstorm: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + selfdestruct: ["3T", "3L21"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + tackle: ["3L1"], + toxic: ["3M"], + }, + }, + ponyta: { + learnset: { + agility: ["3L38"], + attract: ["3M"], + bodyslam: ["3T"], + bounce: ["3L45"], + charm: ["3E"], + doubleedge: ["3T", "3E"], + doublekick: ["3E"], + doubleteam: ["3M"], + ember: ["3L14"], + facade: ["3M"], + fireblast: ["3M", "3L53"], + firespin: ["3L25"], + flamethrower: ["3M"], + flamewheel: ["3E"], + frustration: ["3M"], + growl: ["3L5"], + hiddenpower: ["3M"], + hypnosis: ["3E"], + irontail: ["3M"], + mimic: ["3T"], + overheat: ["3M"], + protect: ["3M"], + quickattack: ["3L1"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + solarbeam: ["3M"], + stomp: ["3L19"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + tailwhip: ["3L9"], + takedown: ["3L31"], + thrash: ["3E"], + toxic: ["3M"], + }, + }, + rapidash: { + learnset: { + agility: ["3L38"], + attract: ["3M"], + bodyslam: ["3T"], + bounce: ["3L50"], + doubleedge: ["3T"], + doubleteam: ["3M"], + ember: ["3L1"], + facade: ["3M"], + fireblast: ["3M", "3L63"], + firespin: ["3L25"], + flamethrower: ["3M"], + frustration: ["3M"], + furyattack: ["3L40"], + growl: ["3L1"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + overheat: ["3M"], + protect: ["3M"], + quickattack: ["3L1"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + solarbeam: ["3M"], + stomp: ["3L19"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + tailwhip: ["3L1"], + takedown: ["3L31"], + toxic: ["3M"], + }, + encounters: [ + {generation: 3, level: 37}, + ], + }, + slowpoke: { + learnset: { + amnesia: ["3L36"], + attract: ["3M"], + bellydrum: ["3E"], + blizzard: ["3M"], + bodyslam: ["3T"], + calmmind: ["3M"], + confusion: ["3L17"], + curse: ["3L1"], + dig: ["3M"], + disable: ["3L24"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + earthquake: ["3M"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + flash: ["3M"], + frustration: ["3M"], + growl: ["3L6"], + hail: ["3M"], + headbutt: ["3L29"], + hiddenpower: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + protect: ["3M"], + psychic: ["3M", "3L40"], + psychup: ["3T", "3L47"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + safeguard: ["3M", "3E"], + secretpower: ["3M"], + shadowball: ["3M"], + skillswap: ["3M"], + sleeptalk: ["3T", "3E"], + snore: ["3T", "3E"], + stomp: ["3E"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + surf: ["3M"], + tackle: ["3L1"], + thunderwave: ["3T"], + toxic: ["3M"], + watergun: ["3L13"], + waterpulse: ["3M"], + yawn: ["3L1"], + }, + }, + slowbro: { + learnset: { + amnesia: ["3L36"], + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + calmmind: ["3M"], + confusion: ["3L17"], + counter: ["3T"], + curse: ["3L1"], + dig: ["3M"], + disable: ["3L24"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + earthquake: ["3M"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + growl: ["3L1"], + hail: ["3M"], + headbutt: ["3L29"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + protect: ["3M"], + psychic: ["3M", "3L44"], + psychup: ["3T", "3L55"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + safeguard: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + skillswap: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + surf: ["3M"], + tackle: ["3L1"], + thunderwave: ["3T"], + toxic: ["3M"], + watergun: ["3L13"], + waterpulse: ["3M"], + withdraw: ["3L37"], + yawn: ["3L1"], + }, + encounters: [ + {generation: 3, level: 32}, + ], + }, + slowking: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + calmmind: ["3M"], + confusion: ["3L17"], + counter: ["3T"], + curse: ["3L1"], + dig: ["3M"], + disable: ["3L24"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + earthquake: ["3M"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + growl: ["3L6"], + hail: ["3M"], + headbutt: ["3L29"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + protect: ["3M"], + psychic: ["3M", "3L40"], + psychup: ["3T", "3L47"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + safeguard: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + skillswap: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + surf: ["3M"], + swagger: ["3T", "3L36"], + tackle: ["3L1"], + thunderwave: ["3T"], + toxic: ["3M"], + watergun: ["3L13"], + waterpulse: ["3M"], + yawn: ["3L1"], + }, + }, + magnemite: { + learnset: { + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + lockon: ["3L32"], + metalsound: ["3L1"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + screech: ["3L44"], + secretpower: ["3M"], + shockwave: ["3M"], + sonicboom: ["3L16"], + spark: ["3L26"], + substitute: ["3T"], + sunnyday: ["3M"], + supersonic: ["3L11"], + swift: ["3T", "3L38"], + tackle: ["3L1"], + thunder: ["3M"], + thunderbolt: ["3M"], + thundershock: ["3L6"], + thunderwave: ["3T", "3L21"], + toxic: ["3M"], + zapcannon: ["3L50"], + }, + }, + magneton: { + learnset: { + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + lockon: ["3L35"], + metalsound: ["3L1"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + screech: ["3L53"], + secretpower: ["3M"], + shockwave: ["3M"], + sonicboom: ["3L16"], + spark: ["3L26"], + substitute: ["3T"], + sunnyday: ["3M"], + supersonic: ["3L1"], + tackle: ["3L1"], + thunder: ["3M"], + thunderbolt: ["3M"], + thundershock: ["3L1"], + thunderwave: ["3T", "3L21"], + toxic: ["3M"], + triattack: ["3L44"], + zapcannon: ["3L62"], + }, + encounters: [ + {generation: 3, level: 26}, + ], + }, + farfetchd: { + learnset: { + aerialace: ["3M"], + agility: ["3L36"], + attract: ["3M"], + bodyslam: ["3T"], + curse: ["3E"], + cut: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + falseswipe: ["3L46"], + featherdance: ["3E"], + flail: ["3E"], + fly: ["3M"], + frustration: ["3M"], + furyattack: ["3L16"], + furycutter: ["3L26"], + gust: ["3E"], + hiddenpower: ["3M"], + irontail: ["3M"], + knockoff: ["3L21"], + leer: ["3L11"], + mimic: ["3T"], + mirrormove: ["3E"], + peck: ["3L1"], + protect: ["3M"], + quickattack: ["3E"], + rest: ["3M"], + return: ["3M"], + sandattack: ["3L6"], + secretpower: ["3M"], + slash: ["3L41"], + steelwing: ["3M", "3E"], + substitute: ["3T"], + sunnyday: ["3M"], + swordsdance: ["3T", "3L31"], + thief: ["3M"], + toxic: ["3M"], + }, + encounters: [ + {generation: 3, level: 3, gender: "M", nature: "Adamant", ivs: {hp: 20, atk: 25, def: 21, spa: 24, spd: 15, spe: 20}, abilities: ["keeneye"], pokeball: "pokeball"}, + ], + }, + doduo: { + learnset: { + aerialace: ["3M"], + agility: ["3L45"], + attract: ["3M"], + bodyslam: ["3T"], + doubleedge: ["3T"], + doubleteam: ["3M"], + drillpeck: ["3L37"], + facade: ["3M"], + feintattack: ["3E"], + flail: ["3E"], + fly: ["3M"], + frustration: ["3M"], + furyattack: ["3L13"], + growl: ["3L1"], + haze: ["3E"], + hiddenpower: ["3M"], + mimic: ["3T"], + peck: ["3L1"], + protect: ["3M"], + pursuit: ["3L9"], + quickattack: ["3E"], + rage: ["3L25"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + steelwing: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + supersonic: ["3E"], + thief: ["3M"], + toxic: ["3M"], + triattack: ["3L21"], + uproar: ["3L33"], + }, + }, + dodrio: { + learnset: { + aerialace: ["3M"], + agility: ["3L60"], + attract: ["3M"], + bodyslam: ["3T"], + doubleedge: ["3T"], + doubleteam: ["3M"], + drillpeck: ["3L47"], + facade: ["3M"], + fly: ["3M"], + frustration: ["3M"], + furyattack: ["3L1"], + growl: ["3L1"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + mimic: ["3T"], + peck: ["3L1"], + protect: ["3M"], + pursuit: ["3L1"], + rage: ["3L25"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + steelwing: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + taunt: ["3M"], + thief: ["3M"], + torment: ["3M"], + toxic: ["3M"], + triattack: ["3L21"], + uproar: ["3L38"], + }, + encounters: [ + {generation: 3, level: 29, pokeball: "safariball"}, + ], + }, + seel: { + learnset: { + attract: ["3M"], + aurorabeam: ["3L21"], + blizzard: ["3M"], + bodyslam: ["3T"], + disable: ["3E"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + encore: ["3E"], + facade: ["3M"], + fakeout: ["3E"], + frustration: ["3M"], + growl: ["3L9"], + hail: ["3M"], + headbutt: ["3L1"], + hiddenpower: ["3M"], + horndrill: ["3E"], + icebeam: ["3M", "3L41"], + icywind: ["3T", "3L17"], + mimic: ["3T"], + perishsong: ["3E"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M", "3L29"], + return: ["3M"], + safeguard: ["3M", "3L49"], + secretpower: ["3M"], + slam: ["3E"], + substitute: ["3T"], + surf: ["3M"], + takedown: ["3L37"], + thief: ["3M"], + toxic: ["3M"], + waterfall: ["3M"], + waterpulse: ["3M"], + }, + }, + dewgong: { + learnset: { + attract: ["3M"], + aurorabeam: ["3L1"], + blizzard: ["3M"], + bodyslam: ["3T"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + frustration: ["3M"], + growl: ["3L1"], + hail: ["3M"], + headbutt: ["3L1"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M", "3L51"], + icywind: ["3T", "3L1"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M", "3L29"], + return: ["3M"], + safeguard: ["3M", "3L64"], + secretpower: ["3M"], + sheercold: ["3L34"], + signalbeam: ["3L1"], + substitute: ["3T"], + surf: ["3M"], + takedown: ["3L42"], + thief: ["3M"], + toxic: ["3M"], + waterfall: ["3M"], + waterpulse: ["3M"], + }, + encounters: [ + {generation: 3, level: 32}, + ], + }, + grimer: { + learnset: { + acidarmor: ["3L34"], + attract: ["3M"], + bodyslam: ["3T"], + curse: ["3E"], + dig: ["3M"], + disable: ["3L8"], + doubleteam: ["3M"], + explosion: ["3T", "3E"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + harden: ["3L4"], + haze: ["3E"], + hiddenpower: ["3M"], + lick: ["3E"], + meanlook: ["3E"], + memento: ["3L53"], + mimic: ["3T"], + minimize: ["3L19"], + poisongas: ["3L1"], + pound: ["3L1"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocktomb: ["3M"], + screech: ["3L26"], + secretpower: ["3M"], + shadowpunch: ["3E"], + shockwave: ["3M"], + sludge: ["3L13"], + sludgebomb: ["3M", "3L43"], + substitute: ["3T"], + sunnyday: ["3M"], + taunt: ["3M"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + torment: ["3M"], + toxic: ["3M"], + }, + }, + muk: { + learnset: { + acidarmor: ["3L34"], + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + dig: ["3M"], + disable: ["3L8"], + doubleteam: ["3M"], + explosion: ["3T"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + harden: ["3L1"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + memento: ["3L61"], + mimic: ["3T"], + minimize: ["3L19"], + poisongas: ["3L1"], + pound: ["3L1"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + rocktomb: ["3M"], + screech: ["3L26"], + secretpower: ["3M"], + shockwave: ["3M"], + sludge: ["3L13"], + sludgebomb: ["3M", "3L47"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + taunt: ["3M"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + torment: ["3M"], + toxic: ["3M"], + }, + encounters: [ + {generation: 3, level: 32}, + ], + }, + shellder: { + learnset: { + attract: ["3M"], + aurorabeam: ["3L17"], + barrier: ["3E"], + blizzard: ["3M"], + bubblebeam: ["3E"], + clamp: ["3L41"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + explosion: ["3T"], + facade: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + icebeam: ["3M", "3L49"], + iciclespear: ["3L8"], + leer: ["3L33"], + mimic: ["3T"], + protect: ["3M", "3L25"], + raindance: ["3M"], + rapidspin: ["3E"], + rest: ["3M"], + return: ["3M"], + screech: ["3E"], + secretpower: ["3M"], + substitute: ["3T"], + supersonic: ["3L9"], + surf: ["3M"], + tackle: ["3L1"], + toxic: ["3M"], + waterpulse: ["3M"], + withdraw: ["3L1"], + }, + }, + cloyster: { + learnset: { + attract: ["3M"], + aurorabeam: ["3L1"], + blizzard: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + explosion: ["3T"], + facade: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + mimic: ["3T"], + protect: ["3M", "3L1"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + spikecannon: ["3L41"], + spikes: ["3L33"], + substitute: ["3T"], + supersonic: ["3L1"], + surf: ["3M"], + torment: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + withdraw: ["3L1"], + }, + }, + gastly: { + learnset: { + astonish: ["3E"], + attract: ["3M"], + confuseray: ["3L21"], + curse: ["3L13"], + destinybond: ["3L33"], + doubleteam: ["3M"], + dreameater: ["3T", "3L28"], + explosion: ["3T", "3E"], + facade: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + grudge: ["3E"], + haze: ["3E"], + hiddenpower: ["3M"], + hypnosis: ["3L1"], + lick: ["3L1"], + meanlook: ["3L13"], + mimic: ["3T"], + nightmare: ["3T", "3L41"], + nightshade: ["3L16"], + perishsong: ["3E"], + protect: ["3M"], + psychic: ["3M"], + psywave: ["3E"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + shadowball: ["3M", "3L36"], + skillswap: ["3M"], + sludgebomb: ["3M"], + snatch: ["3M"], + spite: ["3L8"], + substitute: ["3T"], + sunnyday: ["3M"], + taunt: ["3M"], + thief: ["3M"], + thunderbolt: ["3M"], + torment: ["3M"], + toxic: ["3M"], + }, + }, + haunter: { + learnset: { + attract: ["3M"], + confuseray: ["3L21"], + curse: ["3L13"], + destinybond: ["3L39"], + doubleteam: ["3M"], + dreameater: ["3T", "3L31"], + explosion: ["3T"], + facade: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + hiddenpower: ["3M"], + hypnosis: ["3L1"], + lick: ["3L1"], + meanlook: ["3L13"], + mimic: ["3T"], + nightmare: ["3T", "3L53"], + nightshade: ["3L16"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + shadowball: ["3M", "3L45"], + shadowpunch: ["3L25"], + skillswap: ["3M"], + sludgebomb: ["3M"], + snatch: ["3M"], + spite: ["3L1"], + substitute: ["3T"], + sunnyday: ["3M"], + taunt: ["3M"], + thief: ["3M"], + thunderbolt: ["3M"], + torment: ["3M"], + toxic: ["3M"], + }, + encounters: [ + {generation: 3, level: 20}, + ], + }, + gengar: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + confuseray: ["3L21"], + counter: ["3T"], + curse: ["3L13"], + destinybond: ["3L39"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T", "3L31"], + explosion: ["3T"], + facade: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + hypnosis: ["3L1"], + lick: ["3L1"], + meanlook: ["3L13"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + nightmare: ["3T", "3L53"], + nightshade: ["3L16"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M", "3L45"], + shadowpunch: ["3L25"], + skillswap: ["3M"], + sludgebomb: ["3M"], + snatch: ["3M"], + spite: ["3L1"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + taunt: ["3M"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + torment: ["3M"], + toxic: ["3M"], + }, + }, + onix: { + learnset: { + attract: ["3M"], + bind: ["3L8"], + bodyslam: ["3T"], + dig: ["3M"], + doubleedge: ["3T", "3L56"], + doubleteam: ["3M"], + dragonbreath: ["3L30"], + earthquake: ["3M"], + explosion: ["3T", "3E"], + facade: ["3M"], + frustration: ["3M"], + harden: ["3L19"], + hiddenpower: ["3M"], + irontail: ["3M", "3L45"], + mimic: ["3T"], + protect: ["3M"], + rage: ["3L23"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rockslide: ["3T", "3E"], + rocksmash: ["3M"], + rockthrow: ["3L12"], + rocktomb: ["3M"], + sandstorm: ["3M", "3L33"], + sandtomb: ["3L49"], + screech: ["3L1"], + secretpower: ["3M"], + slam: ["3L37"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + tackle: ["3L1"], + taunt: ["3M"], + torment: ["3M"], + toxic: ["3M"], + }, + }, + steelix: { + learnset: { + attract: ["3M"], + bind: ["3L8"], + bodyslam: ["3T"], + crunch: ["3L49"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T", "3L56"], + doubleteam: ["3M"], + dragonbreath: ["3L30"], + earthquake: ["3M"], + explosion: ["3T"], + facade: ["3M"], + frustration: ["3M"], + harden: ["3L19"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + irontail: ["3M", "3L45"], + mimic: ["3T"], + protect: ["3M"], + rage: ["3L23"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + rockthrow: ["3L12"], + rocktomb: ["3M"], + sandstorm: ["3M", "3L33"], + screech: ["3L1"], + secretpower: ["3M"], + slam: ["3L37"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + tackle: ["3L1"], + taunt: ["3M"], + torment: ["3M"], + toxic: ["3M"], + }, + }, + drowzee: { + learnset: { + attract: ["3M"], + barrier: ["3E"], + bodyslam: ["3T"], + brickbreak: ["3M"], + calmmind: ["3M"], + confusion: ["3L11"], + counter: ["3T"], + disable: ["3L7"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + facade: ["3M"], + firepunch: ["3T", "3E"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + futuresight: ["3L45"], + headbutt: ["3L17"], + hiddenpower: ["3M"], + hypnosis: ["3L1"], + icepunch: ["3T", "3E"], + lightscreen: ["3M"], + meditate: ["3L27"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + poisongas: ["3L21"], + pound: ["3L1"], + protect: ["3M"], + psychic: ["3M", "3L31"], + psychup: ["3T", "3L37"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + roleplay: ["3E"], + safeguard: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + skillswap: ["3M"], + snatch: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swagger: ["3T", "3L41"], + taunt: ["3M"], + thief: ["3M"], + thunderpunch: ["3T", "3E"], + thunderwave: ["3T"], + torment: ["3M"], + toxic: ["3M"], + }, + }, + hypno: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + calmmind: ["3M"], + confusion: ["3L1"], + counter: ["3T"], + disable: ["3L1"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + facade: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + futuresight: ["3L57"], + headbutt: ["3L17"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + hypnosis: ["3L1"], + lightscreen: ["3M"], + meditate: ["3L29"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + nightmare: ["3T", "3L1"], + poisongas: ["3L21"], + pound: ["3L1"], + protect: ["3M"], + psychic: ["3M", "3L35"], + psychup: ["3T", "3L43"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + safeguard: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + skillswap: ["3M"], + snatch: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swagger: ["3T", "3L49"], + taunt: ["3M"], + thief: ["3M"], + thunderwave: ["3T"], + torment: ["3M"], + toxic: ["3M"], + }, + }, + krabby: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + bubble: ["3L1"], + crabhammer: ["3L45"], + cut: ["3M"], + dig: ["3M", "3E"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flail: ["3L49", "3E"], + frustration: ["3M"], + guillotine: ["3L34"], + hail: ["3M"], + harden: ["3L16"], + haze: ["3E"], + hiddenpower: ["3M"], + icebeam: ["3M"], + knockoff: ["3E"], + leer: ["3L5"], + mimic: ["3T"], + mudshot: ["3L23"], + protect: ["3M", "3L38"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + rocktomb: ["3M"], + secretpower: ["3M"], + slam: ["3E"], + stomp: ["3L27"], + strength: ["3M"], + substitute: ["3T"], + surf: ["3M"], + swordsdance: ["3T", "3E"], + thief: ["3M"], + toxic: ["3M"], + visegrip: ["3L12"], + waterpulse: ["3M"], + }, + }, + kingler: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + bubble: ["3L1"], + crabhammer: ["3L57"], + cut: ["3M"], + dig: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flail: ["3L65"], + frustration: ["3M"], + guillotine: ["3L38"], + hail: ["3M"], + harden: ["3L1"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + leer: ["3L1"], + metalclaw: ["3L1"], + mimic: ["3T"], + mudshot: ["3L23"], + protect: ["3M", "3L42"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + rocktomb: ["3M"], + secretpower: ["3M"], + stomp: ["3L27"], + strength: ["3M"], + substitute: ["3T"], + surf: ["3M"], + swordsdance: ["3T"], + thief: ["3M"], + toxic: ["3M"], + visegrip: ["3L1"], + waterpulse: ["3M"], + }, + encounters: [ + {generation: 3, level: 25}, + ], + }, + voltorb: { + learnset: { + charge: ["3L1"], + doubleteam: ["3M"], + explosion: ["3T", "3L46"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + lightscreen: ["3M", "3L37"], + mimic: ["3T"], + mirrorcoat: ["3L49"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rollout: ["3T", "3L32"], + screech: ["3L8"], + secretpower: ["3M"], + selfdestruct: ["3T", "3L27"], + shockwave: ["3M"], + sonicboom: ["3L15"], + spark: ["3L21"], + substitute: ["3T"], + swift: ["3T", "3L42"], + tackle: ["3L1"], + taunt: ["3M"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + torment: ["3M"], + toxic: ["3M"], + }, + }, + electrode: { + learnset: { + charge: ["3L1"], + doubleteam: ["3M"], + explosion: ["3T", "3L54"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + lightscreen: ["3M", "3L41"], + mimic: ["3T"], + mirrorcoat: ["3L59"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rollout: ["3T", "3L34"], + screech: ["3L1"], + secretpower: ["3M"], + selfdestruct: ["3T", "3L27"], + shockwave: ["3M"], + sonicboom: ["3L1"], + spark: ["3L21"], + substitute: ["3T"], + swift: ["3T", "3L48"], + tackle: ["3L1"], + taunt: ["3M"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + torment: ["3M"], + toxic: ["3M"], + }, + encounters: [ + {generation: 3, level: 3, nature: "Hasty", ivs: {hp: 19, atk: 16, def: 18, spa: 25, spd: 25, spe: 19}, abilities: ["static"], pokeball: "pokeball"}, + ], + }, + exeggcute: { + learnset: { + attract: ["3M"], + barrage: ["3L1"], + bulletseed: ["3M"], + confusion: ["3L19"], + curse: ["3E"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + explosion: ["3T"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + hiddenpower: ["3M"], + hypnosis: ["3L1"], + ingrain: ["3E"], + leechseed: ["3L13"], + lightscreen: ["3M"], + mimic: ["3T"], + moonlight: ["3E"], + poisonpowder: ["3L31"], + protect: ["3M"], + psychic: ["3M"], + reflect: ["3M", "3L7", "3E"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + skillswap: ["3M"], + sleeppowder: ["3L37"], + sludgebomb: ["3M"], + solarbeam: ["3M", "3L43"], + strength: ["3M"], + stunspore: ["3L25"], + substitute: ["3T"], + sunnyday: ["3M"], + synthesis: ["3E"], + thief: ["3M"], + toxic: ["3M"], + uproar: ["3L1"], + }, + }, + exeggutor: { + learnset: { + attract: ["3M"], + barrage: ["3L1"], + bulletseed: ["3M"], + confusion: ["3L1"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + eggbomb: ["3L31"], + explosion: ["3T"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + hypnosis: ["3L1"], + lightscreen: ["3M"], + mimic: ["3T"], + protect: ["3M"], + psychic: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + skillswap: ["3M"], + sludgebomb: ["3M"], + solarbeam: ["3M"], + stomp: ["3L19"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + thief: ["3M"], + toxic: ["3M"], + }, + }, + cubone: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + bellydrum: ["3E"], + blizzard: ["3M"], + bodyslam: ["3T"], + boneclub: ["3L9"], + bonemerang: ["3L25"], + bonerush: ["3L41"], + brickbreak: ["3M"], + counter: ["3T"], + dig: ["3M"], + doubleedge: ["3T", "3L45"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + falseswipe: ["3L33"], + fireblast: ["3M"], + flamethrower: ["3M"], + focusenergy: ["3L21"], + focuspunch: ["3M"], + frustration: ["3M"], + growl: ["3L1"], + headbutt: ["3L13"], + hiddenpower: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + leer: ["3L17"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + perishsong: ["3E"], + protect: ["3M"], + rage: ["3L29"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T", "3E"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandstorm: ["3M"], + screech: ["3E"], + secretpower: ["3M"], + seismictoss: ["3T"], + skullbash: ["3E"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swordsdance: ["3T", "3E"], + tailwhip: ["3L5"], + thief: ["3M"], + thrash: ["3L37"], + toxic: ["3M"], + }, + }, + marowak: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + boneclub: ["3L1"], + bonemerang: ["3L25"], + bonerush: ["3L53"], + brickbreak: ["3M"], + counter: ["3T"], + dig: ["3M"], + doubleedge: ["3T", "3L61"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + falseswipe: ["3L39"], + fireblast: ["3M"], + flamethrower: ["3M"], + focusenergy: ["3L21"], + focuspunch: ["3M"], + frustration: ["3M"], + growl: ["3L1"], + headbutt: ["3L1"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + leer: ["3L17"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + protect: ["3M"], + rage: ["3L32"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandstorm: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swordsdance: ["3T"], + tailwhip: ["3L1"], + thief: ["3M"], + thrash: ["3L46"], + toxic: ["3M"], + }, + }, + tyrogue: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + bulkup: ["3M"], + counter: ["3T"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + highjumpkick: ["3E"], + machpunch: ["3E"], + megakick: ["3T"], + mimic: ["3T"], + mindreader: ["3E"], + protect: ["3M"], + raindance: ["3M"], + rapidspin: ["3E"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + tackle: ["3L1"], + thief: ["3M"], + toxic: ["3M"], + }, + }, + hitmonlee: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M", "3L20"], + bulkup: ["3M"], + counter: ["3T"], + doubleedge: ["3T"], + doublekick: ["3L1"], + doubleteam: ["3M"], + earthquake: ["3M"], + endure: ["3T", "3L41"], + facade: ["3M"], + focusenergy: ["3L21"], + focuspunch: ["3M"], + foresight: ["3L36"], + frustration: ["3M"], + hiddenpower: ["3M"], + highjumpkick: ["3L26"], + jumpkick: ["3L16"], + meditate: ["3L6"], + megakick: ["3T", "3L46"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + mindreader: ["3L31"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + revenge: ["3L1"], + reversal: ["3L51"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + rollingkick: ["3L11"], + secretpower: ["3M"], + seismictoss: ["3T"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + thief: ["3M"], + toxic: ["3M"], + }, + }, + hitmonchan: { + learnset: { + agility: ["3L7"], + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + bulkup: ["3M"], + cometpunch: ["3L1"], + counter: ["3T", "3L50"], + detect: ["3L44"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + firepunch: ["3T", "3L26"], + focuspunch: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + icepunch: ["3T", "3L26"], + machpunch: ["3L20"], + megakick: ["3T"], + megapunch: ["3T", "3L38"], + metronome: ["3T"], + mimic: ["3T"], + protect: ["3M"], + pursuit: ["3L13"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + revenge: ["3L1"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + skyuppercut: ["3L32"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + thief: ["3M"], + thunderpunch: ["3T", "3L26"], + toxic: ["3M"], + }, + }, + hitmontop: { + learnset: { + agility: ["3L37"], + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + bulkup: ["3M"], + counter: ["3T", "3L31"], + detect: ["3L43"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M"], + endeavor: ["3L49"], + facade: ["3M"], + focusenergy: ["3L7"], + frustration: ["3M"], + hiddenpower: ["3M"], + megakick: ["3T"], + mimic: ["3T"], + protect: ["3M"], + pursuit: ["3L13"], + quickattack: ["3L19"], + raindance: ["3M"], + rapidspin: ["3L25"], + rest: ["3M"], + return: ["3M"], + revenge: ["3L1"], + rockslide: ["3T"], + rocksmash: ["3M"], + rollingkick: ["3L1"], + sandstorm: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + thief: ["3M"], + toxic: ["3M"], + triplekick: ["3L20"], + }, + }, + lickitung: { + learnset: { + attract: ["3M"], + bellydrum: ["3E"], + blizzard: ["3M"], + bodyslam: ["3T", "3E"], + brickbreak: ["3M"], + counter: ["3T"], + curse: ["3E"], + cut: ["3M"], + defensecurl: ["3T", "3L12"], + dig: ["3M"], + disable: ["3L34"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + earthquake: ["3M"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + knockoff: ["3L18"], + lick: ["3L1"], + magnitude: ["3E"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M"], + refresh: ["3L51"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandstorm: ["3M"], + screech: ["3L45"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + slam: ["3L40"], + sleeptalk: ["3E"], + snore: ["3T", "3E"], + solarbeam: ["3M"], + stomp: ["3L23"], + strength: ["3M"], + substitute: ["3T", "3E"], + sunnyday: ["3M"], + supersonic: ["3L7"], + surf: ["3M"], + swordsdance: ["3T"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + wrap: ["3L29"], + }, + }, + koffing: { + learnset: { + attract: ["3M"], + destinybond: ["3L45", "3E"], + doubleteam: ["3M"], + explosion: ["3T", "3L41"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + flash: ["3M"], + frustration: ["3M"], + haze: ["3L33"], + hiddenpower: ["3M"], + memento: ["3L49"], + mimic: ["3T"], + painsplit: ["3E"], + poisongas: ["3L1"], + protect: ["3M"], + psybeam: ["3E"], + psywave: ["3E"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + screech: ["3E"], + secretpower: ["3M"], + selfdestruct: ["3T", "3L17"], + shadowball: ["3M"], + shockwave: ["3M"], + sludge: ["3L21"], + sludgebomb: ["3M"], + smog: ["3L9"], + smokescreen: ["3L25"], + substitute: ["3T"], + sunnyday: ["3M"], + tackle: ["3L1"], + taunt: ["3M"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + torment: ["3M"], + toxic: ["3M"], + }, + }, + weezing: { + learnset: { + attract: ["3M"], + destinybond: ["3L51"], + doubleteam: ["3M"], + explosion: ["3T", "3L44"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + flash: ["3M"], + frustration: ["3M"], + haze: ["3L33"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + memento: ["3L58"], + mimic: ["3T"], + poisongas: ["3L1"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + selfdestruct: ["3T", "3L1"], + shadowball: ["3M"], + shockwave: ["3M"], + sludge: ["3L21"], + sludgebomb: ["3M"], + smog: ["3L1"], + smokescreen: ["3L25"], + substitute: ["3T"], + sunnyday: ["3M"], + tackle: ["3L1"], + taunt: ["3M"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + torment: ["3M"], + toxic: ["3M"], + }, + encounters: [ + {generation: 3, level: 32}, + ], + }, + rhyhorn: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + counter: ["3T", "3E"], + crunch: ["3E"], + curse: ["3E"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M", "3L52"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + frustration: ["3M"], + furyattack: ["3L15"], + hiddenpower: ["3M"], + hornattack: ["3L1"], + horndrill: ["3L38"], + icebeam: ["3M"], + irontail: ["3M"], + magnitude: ["3E"], + megahorn: ["3L57"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rockblast: ["3L29"], + rockslide: ["3T", "3E"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandstorm: ["3M"], + scaryface: ["3L24"], + secretpower: ["3M"], + shockwave: ["3M"], + stomp: ["3L10"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swordsdance: ["3T", "3E"], + tailwhip: ["3L1"], + takedown: ["3L43"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + toxic: ["3M"], + }, + }, + rhydon: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + counter: ["3T"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M", "3L58"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + furyattack: ["3L1"], + hiddenpower: ["3M"], + hornattack: ["3L1"], + horndrill: ["3L38"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + megahorn: ["3L66"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rockblast: ["3L29"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandstorm: ["3M"], + scaryface: ["3L24"], + secretpower: ["3M"], + seismictoss: ["3T"], + shockwave: ["3M"], + stomp: ["3L1"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + surf: ["3M"], + swordsdance: ["3T"], + tailwhip: ["3L1"], + takedown: ["3L46"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + toxic: ["3M"], + }, + }, + chansey: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + calmmind: ["3M"], + counter: ["3T"], + defensecurl: ["3T", "3L41"], + doubleedge: ["3T", "3L57"], + doubleslap: ["3L17"], + doubleteam: ["3M"], + dreameater: ["3T"], + earthquake: ["3M"], + eggbomb: ["3L35"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + growl: ["3L1"], + hail: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + lightscreen: ["3M", "3L49"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T", "3E"], + mimic: ["3T"], + minimize: ["3L23"], + pound: ["3L1"], + present: ["3E"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + refresh: ["3L9"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + rocktomb: ["3M"], + safeguard: ["3M"], + sandstorm: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + sing: ["3L29"], + skillswap: ["3M"], + snatch: ["3M"], + softboiled: ["3T", "3L13"], + solarbeam: ["3M"], + strength: ["3M"], + substitute: ["3T", "3E"], + sunnyday: ["3M"], + tailwhip: ["3L5"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + blissey: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + calmmind: ["3M"], + counter: ["3T"], + defensecurl: ["3T", "3L33"], + doubleedge: ["3T", "3L47"], + doubleslap: ["3L13"], + doubleteam: ["3M"], + dreameater: ["3T"], + earthquake: ["3M"], + eggbomb: ["3L28"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + growl: ["3L1"], + hail: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + lightscreen: ["3M", "3L40"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + minimize: ["3L18"], + pound: ["3L1"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + refresh: ["3L7"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + rocktomb: ["3M"], + safeguard: ["3M"], + sandstorm: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + sing: ["3L23"], + skillswap: ["3M"], + snatch: ["3M"], + softboiled: ["3T", "3L10"], + solarbeam: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + tailwhip: ["3L4"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + tangela: { + learnset: { + absorb: ["3L10"], + amnesia: ["3E"], + attract: ["3M"], + bind: ["3L28"], + bodyslam: ["3T"], + bulletseed: ["3M"], + confusion: ["3E"], + constrict: ["3L1"], + cut: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + growth: ["3L13"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + ingrain: ["3L1"], + leechseed: ["3E"], + megadrain: ["3L31", "3E"], + mimic: ["3T"], + poisonpowder: ["3L19"], + protect: ["3M"], + reflect: ["3E"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + secretpower: ["3M"], + slam: ["3L40"], + sleeppowder: ["3L4"], + sludgebomb: ["3M"], + solarbeam: ["3M"], + stunspore: ["3L37"], + substitute: ["3T"], + sunnyday: ["3M"], + swordsdance: ["3T"], + thief: ["3M"], + tickle: ["3L46"], + toxic: ["3M"], + vinewhip: ["3L22"], + }, + }, + kangaskhan: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + bite: ["3L7"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + cometpunch: ["3L1"], + counter: ["3T", "3E"], + cut: ["3M"], + dig: ["3M"], + disable: ["3E"], + dizzypunch: ["3L43"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M"], + endure: ["3T", "3L37"], + facade: ["3M"], + fakeout: ["3L19"], + fireblast: ["3M"], + flamethrower: ["3M"], + focusenergy: ["3E"], + focuspunch: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + leer: ["3L1"], + megakick: ["3T"], + megapunch: ["3T", "3L25"], + mimic: ["3T"], + protect: ["3M"], + rage: ["3L31"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + reversal: ["3L49"], + roar: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + safeguard: ["3E"], + sandstorm: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + solarbeam: ["3M"], + stomp: ["3E"], + strength: ["3M"], + substitute: ["3T", "3E"], + sunnyday: ["3M"], + surf: ["3M"], + tailwhip: ["3L13"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + horsea: { + learnset: { + agility: ["3L36"], + attract: ["3M"], + aurorabeam: ["3E"], + blizzard: ["3M"], + bubble: ["3L1"], + disable: ["3E"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dragondance: ["3L50"], + dragonrage: ["3E"], + facade: ["3M"], + flail: ["3E"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + hydropump: ["3L43"], + icebeam: ["3M"], + leer: ["3L15"], + mimic: ["3T"], + octazooka: ["3E"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + smokescreen: ["3L8"], + splash: ["3E"], + substitute: ["3T"], + surf: ["3M"], + toxic: ["3M"], + twister: ["3L29"], + waterfall: ["3M"], + watergun: ["3L22"], + waterpulse: ["3M"], + }, + }, + seadra: { + learnset: { + agility: ["3L40"], + attract: ["3M"], + blizzard: ["3M"], + bubble: ["3L1"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dragondance: ["3L62"], + facade: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + hydropump: ["3L51"], + hyperbeam: ["3M"], + icebeam: ["3M"], + leer: ["3L1"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + smokescreen: ["3L1"], + substitute: ["3T"], + surf: ["3M"], + toxic: ["3M"], + twister: ["3L29"], + waterfall: ["3M"], + watergun: ["3L1"], + waterpulse: ["3M"], + }, + encounters: [ + {generation: 3, level: 25}, + ], + }, + kingdra: { + learnset: { + agility: ["3L40"], + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + bubble: ["3L1"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dragondance: ["3L62"], + facade: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + hydropump: ["3L51"], + hyperbeam: ["3M"], + icebeam: ["3M"], + leer: ["3L1"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + smokescreen: ["3L1"], + substitute: ["3T"], + surf: ["3M"], + toxic: ["3M"], + twister: ["3L29"], + waterfall: ["3M"], + watergun: ["3L1"], + waterpulse: ["3M"], + }, + }, + goldeen: { + learnset: { + agility: ["3L52"], + attract: ["3M"], + blizzard: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flail: ["3L24"], + frustration: ["3M"], + furyattack: ["3L29"], + hail: ["3M"], + haze: ["3E"], + hiddenpower: ["3M"], + hornattack: ["3L15"], + horndrill: ["3L43"], + hydropump: ["3E"], + icebeam: ["3M"], + megahorn: ["3L57"], + mimic: ["3T"], + peck: ["3L1"], + protect: ["3M"], + psybeam: ["3E"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + substitute: ["3T"], + supersonic: ["3L10"], + surf: ["3M"], + tailwhip: ["3L1"], + toxic: ["3M"], + waterfall: ["3M", "3L38"], + waterpulse: ["3M"], + watersport: ["3L1"], + }, + }, + seaking: { + learnset: { + agility: ["3L61"], + attract: ["3M"], + blizzard: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flail: ["3L24"], + frustration: ["3M"], + furyattack: ["3L29"], + hail: ["3M"], + hiddenpower: ["3M"], + hornattack: ["3L15"], + horndrill: ["3L49"], + hyperbeam: ["3M"], + icebeam: ["3M"], + megahorn: ["3L69"], + mimic: ["3T"], + peck: ["3L1"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + substitute: ["3T"], + supersonic: ["3L1"], + surf: ["3M"], + tailwhip: ["3L1"], + toxic: ["3M"], + waterfall: ["3M", "3L41"], + waterpulse: ["3M"], + watersport: ["3L1"], + }, + encounters: [ + {generation: 3, level: 20}, + ], + }, + staryu: { + learnset: { + blizzard: ["3M"], + bubblebeam: ["3L28"], + camouflage: ["3L19"], + cosmicpower: ["3L42"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + hail: ["3M"], + harden: ["3L1"], + hiddenpower: ["3M"], + hydropump: ["3L46"], + icebeam: ["3M"], + lightscreen: ["3M", "3L37"], + mimic: ["3T"], + minimize: ["3L33"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + rapidspin: ["3L10"], + recover: ["3L15"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + substitute: ["3T"], + surf: ["3M"], + swift: ["3T", "3L24"], + tackle: ["3L1"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L6"], + waterpulse: ["3M"], + }, + }, + starmie: { + learnset: { + blizzard: ["3M"], + confuseray: ["3L33"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + lightscreen: ["3M"], + mimic: ["3T"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + rapidspin: ["3L1"], + recover: ["3L1"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + skillswap: ["3M"], + substitute: ["3T"], + surf: ["3M"], + swift: ["3T", "3L1"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L1"], + waterpulse: ["3M"], + }, + }, + mrmime: { + learnset: { + attract: ["3M"], + barrier: ["3L1"], + batonpass: ["3L47"], + bodyslam: ["3T"], + brickbreak: ["3M"], + calmmind: ["3M"], + confusion: ["3L5"], + counter: ["3T"], + doubleedge: ["3T"], + doubleslap: ["3L15"], + doubleteam: ["3M"], + dreameater: ["3T"], + encore: ["3L25"], + facade: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + futuresight: ["3E"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + hypnosis: ["3E"], + lightscreen: ["3M", "3L19"], + magicalleaf: ["3L22"], + meditate: ["3L12"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T", "3E"], + protect: ["3M"], + psybeam: ["3L29"], + psychic: ["3M", "3L43"], + psychup: ["3T", "3E"], + raindance: ["3M"], + recycle: ["3L33"], + reflect: ["3M", "3L19"], + rest: ["3M"], + return: ["3M"], + roleplay: ["3L40"], + safeguard: ["3M", "3L50"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + skillswap: ["3M"], + snatch: ["3M"], + solarbeam: ["3M"], + substitute: ["3T", "3L8"], + sunnyday: ["3M"], + taunt: ["3M"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + torment: ["3M"], + toxic: ["3M"], + trick: ["3L36", "3E"], + }, + }, + scyther: { + learnset: { + aerialace: ["3M"], + agility: ["3L21"], + attract: ["3M"], + batonpass: ["3E"], + counter: ["3T", "3E"], + cut: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M", "3L41"], + endure: ["3T", "3E"], + facade: ["3M"], + falseswipe: ["3L16"], + focusenergy: ["3L6"], + frustration: ["3M"], + furycutter: ["3T", "3L46"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + leer: ["3L1"], + lightscreen: ["3E"], + mimic: ["3T"], + protect: ["3M"], + pursuit: ["3L11"], + quickattack: ["3L1"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + reversal: ["3E"], + rocksmash: ["3M"], + safeguard: ["3E"], + secretpower: ["3M"], + silverwind: ["3E"], + slash: ["3L31"], + steelwing: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swordsdance: ["3T", "3L36"], + thief: ["3M"], + toxic: ["3M"], + wingattack: ["3L26"], + }, + }, + scizor: { + learnset: { + aerialace: ["3M"], + agility: ["3L21"], + attract: ["3M"], + counter: ["3T"], + cut: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M", "3L41"], + facade: ["3M"], + falseswipe: ["3L16"], + focusenergy: ["3L6"], + frustration: ["3M"], + furycutter: ["3T", "3L46"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + irondefense: ["3L41"], + leer: ["3L1"], + metalclaw: ["3L26"], + mimic: ["3T"], + protect: ["3M"], + pursuit: ["3L11"], + quickattack: ["3L1"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + sandstorm: ["3M"], + secretpower: ["3M"], + slash: ["3L31"], + steelwing: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swordsdance: ["3T", "3L36"], + thief: ["3M"], + toxic: ["3M"], + }, + }, + smoochum: { + learnset: { + attract: ["3M"], + blizzard: ["3M", "3L57"], + bodyslam: ["3T"], + calmmind: ["3M"], + confusion: ["3L21"], + counter: ["3T"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + facade: ["3M"], + faketears: ["3L37"], + flash: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + icebeam: ["3M"], + icepunch: ["3T", "3E"], + lick: ["3L1"], + lightscreen: ["3M"], + meanlook: ["3L33"], + meditate: ["3E"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + perishsong: ["3L49"], + pound: ["3L1"], + powdersnow: ["3L13"], + protect: ["3M"], + psychic: ["3M", "3L45"], + psychup: ["3T", "3E"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + sing: ["3L25"], + skillswap: ["3M"], + substitute: ["3T"], + sweetkiss: ["3L9"], + thief: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + jynx: { + learnset: { + attract: ["3M"], + blizzard: ["3M", "3L67"], + bodyslam: ["3T", "3L51"], + brickbreak: ["3M"], + calmmind: ["3M"], + counter: ["3T"], + doubleedge: ["3T"], + doubleslap: ["3L21"], + doubleteam: ["3M"], + dreameater: ["3T"], + facade: ["3M"], + faketears: ["3L41"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + icepunch: ["3T", "3L25"], + lick: ["3L1"], + lightscreen: ["3M"], + lovelykiss: ["3L1"], + meanlook: ["3L35"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + perishsong: ["3L57"], + pound: ["3L1"], + powdersnow: ["3L1"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + skillswap: ["3M"], + substitute: ["3T"], + taunt: ["3M"], + thief: ["3M"], + torment: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + encounters: [ + {generation: 3, level: 20, nature: "Mild", ivs: {hp: 18, atk: 17, def: 18, spa: 22, spd: 25, spe: 21}, abilities: ["oblivious"], pokeball: "pokeball"}, + ], + }, + elekid: { + learnset: { + attract: ["3M"], + barrier: ["3E"], + bodyslam: ["3T"], + brickbreak: ["3M"], + counter: ["3T"], + crosschop: ["3E"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + firepunch: ["3T", "3E"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + icepunch: ["3T", "3E"], + karatechop: ["3E"], + leer: ["3L1"], + lightscreen: ["3M", "3L17"], + meditate: ["3E"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + protect: ["3M"], + psychic: ["3M"], + quickattack: ["3L1"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + rollingkick: ["3E"], + screech: ["3L33"], + secretpower: ["3M"], + seismictoss: ["3T"], + shockwave: ["3M"], + substitute: ["3T"], + swift: ["3T", "3L25"], + thief: ["3M"], + thunder: ["3M", "3L49"], + thunderbolt: ["3M", "3L41"], + thunderpunch: ["3T", "3L9"], + thunderwave: ["3T"], + toxic: ["3M"], + }, + }, + electabuzz: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + counter: ["3T"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + irontail: ["3M"], + leer: ["3L1"], + lightscreen: ["3M", "3L17"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + protect: ["3M"], + psychic: ["3M"], + quickattack: ["3L1"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + screech: ["3L36"], + secretpower: ["3M"], + seismictoss: ["3T"], + shockwave: ["3M"], + strength: ["3M"], + substitute: ["3T"], + swift: ["3T", "3L25"], + thief: ["3M"], + thunder: ["3M", "3L58"], + thunderbolt: ["3M", "3L47"], + thunderpunch: ["3T", "3L1"], + thunderwave: ["3T"], + toxic: ["3M"], + }, + }, + magby: { + learnset: { + attract: ["3M"], + barrier: ["3E"], + bodyslam: ["3T"], + brickbreak: ["3M"], + confuseray: ["3L43"], + counter: ["3T"], + crosschop: ["3E"], + doubleedge: ["3T"], + doubleteam: ["3M"], + ember: ["3L1"], + facade: ["3M"], + fireblast: ["3M", "3L49"], + firepunch: ["3T", "3L19"], + flamethrower: ["3M", "3L37"], + focuspunch: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + irontail: ["3M"], + karatechop: ["3E"], + leer: ["3L7"], + megakick: ["3T"], + megapunch: ["3T", "3E"], + mimic: ["3T"], + protect: ["3M"], + psychic: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + screech: ["3E"], + secretpower: ["3M"], + seismictoss: ["3T"], + smog: ["3L13"], + smokescreen: ["3L25"], + substitute: ["3T"], + sunnyday: ["3M", "3L31"], + thief: ["3M"], + thunderpunch: ["3T", "3E"], + toxic: ["3M"], + }, + }, + magmar: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + confuseray: ["3L49"], + counter: ["3T"], + doubleedge: ["3T"], + doubleteam: ["3M"], + ember: ["3L1"], + facade: ["3M"], + fireblast: ["3M", "3L57"], + firepunch: ["3T", "3L1"], + flamethrower: ["3M", "3L41"], + focuspunch: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + irontail: ["3M"], + leer: ["3L1"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + protect: ["3M"], + psychic: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + smog: ["3L1"], + smokescreen: ["3L25"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M", "3L33"], + thief: ["3M"], + toxic: ["3M"], + }, + }, + pinsir: { + learnset: { + attract: ["3M"], + bind: ["3L7"], + bodyslam: ["3T"], + brickbreak: ["3M", "3L31"], + bulkup: ["3M"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + falseswipe: ["3E"], + focusenergy: ["3L1"], + focuspunch: ["3M"], + frustration: ["3M"], + furyattack: ["3E"], + guillotine: ["3L37"], + harden: ["3L19"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + revenge: ["3L25"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T", "3L13"], + strength: ["3M"], + submission: ["3L43"], + substitute: ["3T"], + sunnyday: ["3M"], + swordsdance: ["3T", "3L49"], + thief: ["3M"], + toxic: ["3M"], + visegrip: ["3L1"], + }, + }, + tauros: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hornattack: ["3L8"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + protect: ["3M"], + pursuit: ["3L19"], + rage: ["3L4"], + raindance: ["3M"], + rest: ["3M", "3L34"], + return: ["3M"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandstorm: ["3M"], + scaryface: ["3L13"], + secretpower: ["3M"], + shockwave: ["3M"], + solarbeam: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + surf: ["3M"], + swagger: ["3T", "3L26"], + tackle: ["3L1"], + tailwhip: ["3L1"], + takedown: ["3L53"], + thrash: ["3L43"], + thunder: ["3M"], + thunderbolt: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + magikarp: { + learnset: { + flail: ["3L30"], + splash: ["3L1"], + tackle: ["3L15"], + }, + }, + gyarados: { + learnset: { + attract: ["3M"], + bite: ["3L20"], + blizzard: ["3M"], + bodyslam: ["3T"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dragondance: ["3L50"], + dragonrage: ["3L25"], + earthquake: ["3M"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + hydropump: ["3L40"], + hyperbeam: ["3M", "3L55"], + icebeam: ["3M"], + leer: ["3L30"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M", "3L45"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rocksmash: ["3M"], + sandstorm: ["3M"], + secretpower: ["3M"], + strength: ["3M"], + substitute: ["3T"], + surf: ["3M"], + taunt: ["3M"], + thrash: ["3L1"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + torment: ["3M"], + toxic: ["3M"], + twister: ["3L35"], + waterfall: ["3M"], + waterpulse: ["3M"], + }, + encounters: [ + {generation: 3, level: 5}, + ], + }, + lapras: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T", "3L13"], + confuseray: ["3L19"], + curse: ["3E"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dragondance: ["3E"], + dreameater: ["3T"], + facade: ["3M"], + frustration: ["3M"], + growl: ["3L1"], + hail: ["3M"], + hiddenpower: ["3M"], + horndrill: ["3E"], + hydropump: ["3L49"], + hyperbeam: ["3M"], + icebeam: ["3M", "3L31"], + irontail: ["3M"], + mimic: ["3T"], + mist: ["3L7"], + perishsong: ["3L25"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M", "3L37"], + refresh: ["3E"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rocksmash: ["3M"], + safeguard: ["3M", "3L43"], + secretpower: ["3M"], + sheercold: ["3L55"], + shockwave: ["3M"], + sing: ["3L1"], + sleeptalk: ["3T", "3E"], + strength: ["3M"], + substitute: ["3T", "3E"], + surf: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + tickle: ["3E"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L1"], + waterpulse: ["3M"], + }, + }, + ditto: { + learnset: { + transform: ["3L1"], + }, + encounters: [ + {generation: 3, level: 23}, + ], + }, + eevee: { + learnset: { + attract: ["3M"], + batonpass: ["3L36"], + bite: ["3L30"], + bodyslam: ["3T"], + charm: ["3E"], + curse: ["3E"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + endure: ["3T", "3E"], + facade: ["3M"], + flail: ["3E"], + frustration: ["3M"], + growl: ["3L16"], + helpinghand: ["3L1"], + hiddenpower: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + protect: ["3M"], + quickattack: ["3L23"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + sandattack: ["3L8"], + secretpower: ["3M"], + shadowball: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + tackle: ["3L1"], + tailwhip: ["3L1"], + takedown: ["3L42"], + toxic: ["3M"], + wish: ["3E"], + }, + }, + vaporeon: { + learnset: { + acidarmor: ["3L47"], + attract: ["3M"], + aurorabeam: ["3L36"], + bite: ["3L30"], + blizzard: ["3M"], + bodyslam: ["3T"], + dig: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + frustration: ["3M"], + hail: ["3M"], + haze: ["3L42"], + helpinghand: ["3L1"], + hiddenpower: ["3M"], + hydropump: ["3L52"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + protect: ["3M"], + quickattack: ["3L23"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + sandattack: ["3L8"], + secretpower: ["3M"], + shadowball: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + surf: ["3M"], + tackle: ["3L1"], + tailwhip: ["3L1"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L16"], + waterpulse: ["3M"], + }, + }, + jolteon: { + learnset: { + agility: ["3L47"], + attract: ["3M"], + bodyslam: ["3T"], + dig: ["3M"], + doubleedge: ["3T"], + doublekick: ["3L30"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + helpinghand: ["3L1"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + pinmissile: ["3L36"], + protect: ["3M"], + quickattack: ["3L23"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + sandattack: ["3L8"], + secretpower: ["3M"], + shadowball: ["3M"], + shockwave: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + tackle: ["3L1"], + tailwhip: ["3L1"], + thunder: ["3M", "3L52"], + thunderbolt: ["3M"], + thundershock: ["3L16"], + thunderwave: ["3T", "3L42"], + toxic: ["3M"], + }, + }, + flareon: { + learnset: { + attract: ["3M"], + bite: ["3L30"], + bodyslam: ["3T"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + ember: ["3L16"], + facade: ["3M"], + fireblast: ["3M"], + firespin: ["3L36"], + flamethrower: ["3M", "3L52"], + frustration: ["3M"], + helpinghand: ["3L1"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + irontail: ["3M"], + leer: ["3L47"], + mimic: ["3T"], + overheat: ["3M"], + protect: ["3M"], + quickattack: ["3L23"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + sandattack: ["3L8"], + secretpower: ["3M"], + shadowball: ["3M"], + smog: ["3L42"], + substitute: ["3T"], + sunnyday: ["3M"], + tackle: ["3L1"], + tailwhip: ["3L1"], + toxic: ["3M"], + }, + }, + porygon: { + learnset: { + aerialace: ["3M"], + agility: ["3L9"], + blizzard: ["3M"], + conversion: ["3L1"], + conversion2: ["3L1"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + lockon: ["3L32"], + mimic: ["3T"], + protect: ["3M"], + psybeam: ["3L12"], + psychic: ["3M"], + raindance: ["3M"], + recover: ["3L20"], + recycle: ["3L44"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + shadowball: ["3M"], + sharpen: ["3L24"], + shockwave: ["3M"], + solarbeam: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + tackle: ["3L1"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + toxic: ["3M"], + triattack: ["3L36"], + zapcannon: ["3L48"], + }, + }, + porygon2: { + learnset: { + aerialace: ["3M"], + agility: ["3L9"], + blizzard: ["3M"], + conversion: ["3L1"], + conversion2: ["3L1"], + defensecurl: ["3T", "3L24"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + lockon: ["3L32"], + mimic: ["3T"], + protect: ["3M"], + psybeam: ["3L12"], + psychic: ["3M"], + raindance: ["3M"], + recover: ["3L20"], + recycle: ["3L44"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + shadowball: ["3M"], + shockwave: ["3M"], + solarbeam: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + tackle: ["3L1"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + toxic: ["3M"], + triattack: ["3L36"], + zapcannon: ["3L48"], + }, + }, + omanyte: { + learnset: { + ancientpower: ["3L49"], + attract: ["3M"], + aurorabeam: ["3E"], + bite: ["3L13"], + blizzard: ["3M"], + bodyslam: ["3T"], + bubblebeam: ["3E"], + constrict: ["3L1"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + frustration: ["3M"], + hail: ["3M"], + haze: ["3E"], + hiddenpower: ["3M"], + hydropump: ["3L55"], + icebeam: ["3M"], + leer: ["3L31"], + mimic: ["3T"], + mudshot: ["3L25"], + protect: ["3M", "3L37"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T", "3E"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandstorm: ["3M"], + secretpower: ["3M"], + slam: ["3E"], + spikes: ["3E"], + substitute: ["3T"], + supersonic: ["3E"], + surf: ["3M"], + thief: ["3M"], + tickle: ["3L43"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L19"], + waterpulse: ["3M"], + withdraw: ["3L1"], + }, + }, + omastar: { + learnset: { + ancientpower: ["3L55"], + attract: ["3M"], + bite: ["3L1"], + blizzard: ["3M"], + bodyslam: ["3T"], + constrict: ["3L1"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + hydropump: ["3L65"], + hyperbeam: ["3M"], + icebeam: ["3M"], + leer: ["3L31"], + mimic: ["3T"], + mudshot: ["3L25"], + protect: ["3M", "3L37"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandstorm: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + spikecannon: ["3L40"], + substitute: ["3T"], + surf: ["3M"], + thief: ["3M"], + tickle: ["3L46"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L1"], + waterpulse: ["3M"], + withdraw: ["3L1"], + }, + }, + kabuto: { + learnset: { + absorb: ["3L13"], + aerialace: ["3M"], + ancientpower: ["3L55"], + attract: ["3M"], + aurorabeam: ["3E"], + blizzard: ["3M"], + bodyslam: ["3T"], + bubblebeam: ["3E"], + confuseray: ["3E"], + dig: ["3M", "3E"], + doubleedge: ["3T"], + doubleteam: ["3M"], + endure: ["3T", "3L37"], + facade: ["3M"], + flail: ["3E"], + frustration: ["3M"], + gigadrain: ["3M"], + hail: ["3M"], + harden: ["3L1"], + hiddenpower: ["3M"], + icebeam: ["3M"], + knockoff: ["3E"], + leer: ["3L19"], + megadrain: ["3L49"], + metalsound: ["3L43"], + mimic: ["3T"], + mudshot: ["3L25"], + protect: ["3M"], + raindance: ["3M"], + rapidspin: ["3E"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandattack: ["3L31"], + sandstorm: ["3M"], + scratch: ["3L1"], + secretpower: ["3M"], + substitute: ["3T"], + surf: ["3M"], + thief: ["3M"], + toxic: ["3M"], + waterfall: ["3M"], + waterpulse: ["3M"], + }, + }, + kabutops: { + learnset: { + absorb: ["3L1"], + aerialace: ["3M"], + ancientpower: ["3L65"], + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + cut: ["3M"], + dig: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + endure: ["3T", "3L37"], + facade: ["3M"], + frustration: ["3M"], + furycutter: ["3T", "3L1"], + gigadrain: ["3M"], + hail: ["3M"], + harden: ["3L1"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + leer: ["3L1"], + megadrain: ["3L55"], + megakick: ["3T"], + metalsound: ["3L46"], + mimic: ["3T"], + mudshot: ["3L25"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandattack: ["3L31"], + sandstorm: ["3M"], + scratch: ["3L1"], + secretpower: ["3M"], + seismictoss: ["3T"], + slash: ["3L40"], + substitute: ["3T"], + surf: ["3M"], + swordsdance: ["3T"], + thief: ["3M"], + toxic: ["3M"], + waterfall: ["3M"], + waterpulse: ["3M"], + }, + }, + aerodactyl: { + learnset: { + aerialace: ["3M"], + agility: ["3L8"], + ancientpower: ["3L29"], + attract: ["3M"], + bite: ["3L15"], + curse: ["3E"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dragonclaw: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + fly: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M", "3L50"], + irontail: ["3M"], + mimic: ["3T"], + protect: ["3M"], + pursuit: ["3E"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandstorm: ["3M"], + scaryface: ["3L36"], + secretpower: ["3M"], + steelwing: ["3M", "3E"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + supersonic: ["3L22"], + takedown: ["3L43"], + taunt: ["3M"], + thief: ["3M"], + torment: ["3M"], + toxic: ["3M"], + whirlwind: ["3E"], + wingattack: ["3L1"], + }, + }, + snorlax: { + learnset: { + amnesia: ["3L5"], + attract: ["3M"], + bellydrum: ["3L13"], + blizzard: ["3M"], + block: ["3L37"], + bodyslam: ["3T", "3L33"], + brickbreak: ["3M"], + counter: ["3T"], + covet: ["3L42"], + curse: ["3E"], + defensecurl: ["3T", "3L9"], + doubleedge: ["3T", "3E"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + headbutt: ["3L17"], + hiddenpower: ["3M"], + hyperbeam: ["3M", "3L51"], + icebeam: ["3M"], + lick: ["3E"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + rest: ["3M", "3L25"], + return: ["3M"], + rockslide: ["3T"], + rocktomb: ["3M"], + rollout: ["3T", "3L46"], + sandstorm: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + sleeptalk: ["3T", "3L37"], + snore: ["3T", "3L28"], + solarbeam: ["3M"], + strength: ["3M"], + substitute: ["3T", "3E"], + sunnyday: ["3M"], + surf: ["3M"], + tackle: ["3L1"], + thunder: ["3M"], + thunderbolt: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + yawn: ["3L21"], + }, + }, + articuno: { + learnset: { + aerialace: ["3M"], + agility: ["3L25"], + blizzard: ["3M", "3L73"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + fly: ["3M"], + frustration: ["3M"], + gust: ["3L1"], + hail: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M", "3L49"], + mimic: ["3T"], + mindreader: ["3L37"], + mist: ["3L13"], + powdersnow: ["3L1"], + protect: ["3M"], + raindance: ["3M"], + reflect: ["3M", "3L61"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rocksmash: ["3M"], + sandstorm: ["3M"], + secretpower: ["3M"], + sheercold: ["3L85"], + steelwing: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + zapdos: { + learnset: { + aerialace: ["3M"], + agility: ["3L25"], + charge: ["3L61"], + detect: ["3L37"], + doubleedge: ["3T"], + doubleteam: ["3M"], + drillpeck: ["3L49"], + facade: ["3M"], + flash: ["3M"], + fly: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + lightscreen: ["3M", "3L73"], + mimic: ["3T"], + peck: ["3L1"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rocksmash: ["3M"], + sandstorm: ["3M"], + secretpower: ["3M"], + shockwave: ["3M"], + steelwing: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + thunder: ["3M", "3L85"], + thunderbolt: ["3M"], + thundershock: ["3L1"], + thunderwave: ["3T", "3L13"], + toxic: ["3M"], + }, + }, + moltres: { + learnset: { + aerialace: ["3M"], + agility: ["3L25"], + doubleedge: ["3T"], + doubleteam: ["3M"], + ember: ["3L1"], + endure: ["3T", "3L37"], + facade: ["3M"], + fireblast: ["3M"], + firespin: ["3L13"], + flamethrower: ["3M", "3L49"], + fly: ["3M"], + frustration: ["3M"], + heatwave: ["3L73"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + mimic: ["3T"], + overheat: ["3M"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rocksmash: ["3M"], + safeguard: ["3M", "3L61"], + sandstorm: ["3M"], + secretpower: ["3M"], + skyattack: ["3T", "3L85"], + steelwing: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + toxic: ["3M"], + wingattack: ["3L1"], + }, + }, + dratini: { + learnset: { + agility: ["3L36"], + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dragondance: ["3E"], + dragonrage: ["3L22"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + frustration: ["3M"], + hail: ["3M"], + haze: ["3E"], + hiddenpower: ["3M"], + hyperbeam: ["3M", "3L57"], + icebeam: ["3M"], + irontail: ["3M"], + leer: ["3L1"], + lightscreen: ["3E"], + mimic: ["3T"], + mist: ["3E"], + outrage: ["3L50"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + safeguard: ["3M", "3L43"], + secretpower: ["3M"], + shockwave: ["3M"], + slam: ["3L29"], + substitute: ["3T"], + sunnyday: ["3M"], + supersonic: ["3E"], + surf: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T", "3L8"], + toxic: ["3M"], + twister: ["3L15"], + waterfall: ["3M"], + waterpulse: ["3M"], + wrap: ["3L1"], + }, + }, + dragonair: { + learnset: { + agility: ["3L38"], + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dragonrage: ["3L22"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M", "3L65"], + icebeam: ["3M"], + irontail: ["3M"], + leer: ["3L1"], + mimic: ["3T"], + outrage: ["3L56"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + safeguard: ["3M", "3L47"], + secretpower: ["3M"], + shockwave: ["3M"], + slam: ["3L29"], + substitute: ["3T"], + sunnyday: ["3M"], + surf: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T", "3L1"], + toxic: ["3M"], + twister: ["3L1"], + waterfall: ["3M"], + waterpulse: ["3M"], + wrap: ["3L1"], + }, + encounters: [ + {generation: 3, level: 25, pokeball: "safariball"}, + ], + }, + dragonite: { + learnset: { + aerialace: ["3M"], + agility: ["3L38"], + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + cut: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dragonclaw: ["3M"], + dragonrage: ["3L22"], + earthquake: ["3M"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + fly: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M", "3L75"], + icebeam: ["3M"], + irontail: ["3M"], + leer: ["3L1"], + mimic: ["3T"], + outrage: ["3L61"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rocksmash: ["3M"], + rocktomb: ["3M"], + safeguard: ["3M", "3L47"], + sandstorm: ["3M"], + secretpower: ["3M"], + shockwave: ["3M"], + slam: ["3L29"], + steelwing: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + surf: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T", "3L1"], + toxic: ["3M"], + twister: ["3L1"], + waterfall: ["3M"], + waterpulse: ["3M"], + wingattack: ["3L55"], + wrap: ["3L1"], + }, + }, + mewtwo: { + learnset: { + aerialace: ["3M"], + amnesia: ["3L77"], + barrier: ["3L11"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + bulkup: ["3M"], + calmmind: ["3M"], + confusion: ["3L1"], + counter: ["3T"], + disable: ["3L1"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + earthquake: ["3M"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + futuresight: ["3L44"], + hail: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + lightscreen: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T"], + mimic: ["3T"], + mist: ["3L22"], + protect: ["3M"], + psychic: ["3M", "3L66"], + psychup: ["3T", "3L33"], + raindance: ["3M"], + recover: ["3L44"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + rocktomb: ["3M"], + safeguard: ["3M", "3L55"], + sandstorm: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + skillswap: ["3M"], + snatch: ["3M"], + solarbeam: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swift: ["3T", "3L22"], + taunt: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + torment: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + sentret: { + learnset: { + amnesia: ["3L49"], + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + cut: ["3M"], + defensecurl: ["3T", "3L4"], + dig: ["3M"], + doubleedge: ["3T", "3E"], + doubleteam: ["3M"], + facade: ["3M"], + flamethrower: ["3M"], + focusenergy: ["3E"], + focuspunch: ["3M"], + followme: ["3L31"], + frustration: ["3M"], + furyswipes: ["3L12"], + helpinghand: ["3L17"], + hiddenpower: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + protect: ["3M"], + pursuit: ["3E"], + quickattack: ["3L7"], + raindance: ["3M"], + rest: ["3M", "3L40"], + return: ["3M"], + scratch: ["3L1"], + secretpower: ["3M"], + shadowball: ["3M"], + shockwave: ["3M"], + slam: ["3L24"], + slash: ["3E"], + solarbeam: ["3M"], + substitute: ["3T", "3E"], + sunnyday: ["3M"], + surf: ["3M"], + thief: ["3M"], + thunderbolt: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + furret: { + learnset: { + amnesia: ["3L59"], + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + cut: ["3M"], + defensecurl: ["3T", "3L1"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flamethrower: ["3M"], + focuspunch: ["3M"], + followme: ["3L37"], + frustration: ["3M"], + furyswipes: ["3L12"], + helpinghand: ["3L19"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + protect: ["3M"], + quickattack: ["3L1"], + raindance: ["3M"], + rest: ["3M", "3L48"], + return: ["3M"], + rocksmash: ["3M"], + scratch: ["3L1"], + secretpower: ["3M"], + shadowball: ["3M"], + shockwave: ["3M"], + slam: ["3L28"], + solarbeam: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + surf: ["3M"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + ledyba: { + learnset: { + aerialace: ["3M"], + agility: ["3L43"], + attract: ["3M"], + batonpass: ["3L29"], + brickbreak: ["3M"], + cometpunch: ["3L15"], + dig: ["3M"], + doubleedge: ["3T", "3L50"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + hiddenpower: ["3M"], + lightscreen: ["3M", "3L22"], + megapunch: ["3T"], + mimic: ["3T"], + protect: ["3M"], + psybeam: ["3E"], + reflect: ["3M", "3L22"], + rest: ["3M"], + return: ["3M"], + safeguard: ["3M", "3L22"], + secretpower: ["3M"], + silverwind: ["3E"], + solarbeam: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + supersonic: ["3L8"], + swift: ["3T", "3L36"], + swordsdance: ["3T"], + tackle: ["3L1"], + thief: ["3M"], + toxic: ["3M"], + }, + }, + ledian: { + learnset: { + aerialace: ["3M"], + agility: ["3L51"], + attract: ["3M"], + batonpass: ["3L33"], + brickbreak: ["3M"], + cometpunch: ["3L15"], + dig: ["3M"], + doubleedge: ["3T", "3L60"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + lightscreen: ["3M", "3L24"], + megapunch: ["3T"], + mimic: ["3T"], + protect: ["3M"], + reflect: ["3M", "3L24"], + rest: ["3M"], + return: ["3M"], + safeguard: ["3M", "3L24"], + secretpower: ["3M"], + solarbeam: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + supersonic: ["3L1"], + swift: ["3T", "3L42"], + swordsdance: ["3T"], + tackle: ["3L1"], + thief: ["3M"], + toxic: ["3M"], + }, + }, + spinarak: { + learnset: { + agility: ["3L45"], + attract: ["3M"], + batonpass: ["3E"], + bodyslam: ["3T"], + constrict: ["3L11"], + dig: ["3M"], + disable: ["3E"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + furyswipes: ["3L30"], + gigadrain: ["3M"], + hiddenpower: ["3M"], + leechlife: ["3L23"], + mimic: ["3T"], + nightshade: ["3L17"], + poisonsting: ["3L1"], + protect: ["3M"], + psybeam: ["3E"], + psychic: ["3M", "3L53"], + pursuit: ["3E"], + rest: ["3M"], + return: ["3M"], + scaryface: ["3L6"], + secretpower: ["3M"], + sludgebomb: ["3M"], + solarbeam: ["3M"], + sonicboom: ["3E"], + spiderweb: ["3L37"], + stringshot: ["3L1"], + substitute: ["3T"], + sunnyday: ["3M"], + thief: ["3M"], + toxic: ["3M"], + }, + }, + ariados: { + learnset: { + agility: ["3L53"], + attract: ["3M"], + bodyslam: ["3T"], + constrict: ["3L1"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + furyswipes: ["3L34"], + gigadrain: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + leechlife: ["3L25"], + mimic: ["3T"], + nightshade: ["3L17"], + poisonsting: ["3L1"], + protect: ["3M"], + psychic: ["3M", "3L63"], + rest: ["3M"], + return: ["3M"], + scaryface: ["3L1"], + secretpower: ["3M"], + sludgebomb: ["3M"], + solarbeam: ["3M"], + spiderweb: ["3L43"], + stringshot: ["3L1"], + substitute: ["3T"], + sunnyday: ["3M"], + thief: ["3M"], + toxic: ["3M"], + }, + }, + togepi: { + learnset: { + ancientpower: ["3L21"], + attract: ["3M"], + batonpass: ["3L41"], + bodyslam: ["3T"], + charm: ["3L1"], + counter: ["3T"], + doubleedge: ["3T", "3L37"], + doubleteam: ["3M"], + dreameater: ["3T"], + encore: ["3L17"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + flash: ["3M"], + followme: ["3L25"], + frustration: ["3M"], + futuresight: ["3E"], + growl: ["3L1"], + hiddenpower: ["3M"], + lightscreen: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T", "3L4"], + mimic: ["3T"], + mirrormove: ["3E"], + peck: ["3E"], + present: ["3E"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + safeguard: ["3M", "3L33"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + softboiled: ["3T"], + solarbeam: ["3M"], + substitute: ["3T", "3E"], + sunnyday: ["3M"], + sweetkiss: ["3L9"], + thunderwave: ["3T"], + toxic: ["3M"], + waterpulse: ["3M"], + wish: ["3L29"], + yawn: ["3L13"], + }, + }, + togetic: { + learnset: { + aerialace: ["3M"], + ancientpower: ["3L21"], + attract: ["3M"], + batonpass: ["3L41"], + bodyslam: ["3T"], + brickbreak: ["3M"], + charm: ["3L1"], + counter: ["3T"], + doubleedge: ["3T", "3L37"], + doubleteam: ["3M"], + dreameater: ["3T"], + encore: ["3L17"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + flash: ["3M"], + fly: ["3M"], + focuspunch: ["3M"], + followme: ["3L25"], + frustration: ["3M"], + growl: ["3L1"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + lightscreen: ["3M"], + magicalleaf: ["3L1"], + megakick: ["3T"], + megapunch: ["3T"], + metronome: ["3T", "3L1"], + mimic: ["3T"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + safeguard: ["3M", "3L33"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + softboiled: ["3T"], + solarbeam: ["3M"], + steelwing: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + sweetkiss: ["3L1"], + thunderwave: ["3T"], + toxic: ["3M"], + waterpulse: ["3M"], + wish: ["3L29"], + yawn: ["3L13"], + }, + }, + natu: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + calmmind: ["3M"], + confuseray: ["3L40"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + drillpeck: ["3E"], + facade: ["3M"], + featherdance: ["3E"], + feintattack: ["3E"], + flash: ["3M"], + frustration: ["3M"], + futuresight: ["3L30"], + gigadrain: ["3M"], + haze: ["3E"], + hiddenpower: ["3M"], + leer: ["3L1"], + lightscreen: ["3M"], + mimic: ["3T"], + nightshade: ["3L10"], + peck: ["3L1"], + protect: ["3M"], + psychic: ["3M", "3L50"], + quickattack: ["3E"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + shadowball: ["3M"], + skillswap: ["3M"], + solarbeam: ["3M"], + steelwing: ["3M", "3E"], + substitute: ["3T"], + sunnyday: ["3M"], + teleport: ["3L20"], + thief: ["3M"], + thunderwave: ["3T"], + toxic: ["3M"], + wish: ["3L30"], + }, + }, + xatu: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + calmmind: ["3M"], + confuseray: ["3L50"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + facade: ["3M"], + flash: ["3M"], + fly: ["3M"], + frustration: ["3M"], + futuresight: ["3L35"], + gigadrain: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + leer: ["3L1"], + lightscreen: ["3M"], + mimic: ["3T"], + nightshade: ["3L10"], + peck: ["3L1"], + protect: ["3M"], + psychic: ["3M", "3L65"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + shadowball: ["3M"], + skillswap: ["3M"], + solarbeam: ["3M"], + steelwing: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + teleport: ["3L20"], + thief: ["3M"], + thunderwave: ["3T"], + toxic: ["3M"], + wish: ["3L35"], + }, + }, + azurill: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + bubble: ["3L10"], + charm: ["3L3"], + doubleedge: ["3T"], + doubleteam: ["3M"], + encore: ["3E"], + facade: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M"], + refresh: ["3E"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + sing: ["3E"], + slam: ["3L15", "3E"], + splash: ["3L1"], + substitute: ["3T"], + surf: ["3M"], + tailwhip: ["3L6"], + tickle: ["3E"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L21"], + waterpulse: ["3M"], + }, + }, + marill: { + learnset: { + amnesia: ["3E"], + attract: ["3M"], + bellydrum: ["3E"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + bubblebeam: ["3L21"], + defensecurl: ["3T", "3L3"], + dig: ["3M"], + dive: ["3M"], + doubleedge: ["3T", "3L28"], + doubleteam: ["3M"], + facade: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + hydropump: ["3L45"], + icebeam: ["3M"], + irontail: ["3M"], + lightscreen: ["3E"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + perishsong: ["3E"], + present: ["3E"], + protect: ["3M"], + raindance: ["3M", "3L36"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + rollout: ["3T", "3L15"], + secretpower: ["3M"], + seismictoss: ["3T"], + strength: ["3M"], + substitute: ["3T", "3E"], + supersonic: ["3E"], + surf: ["3M"], + tackle: ["3L1"], + tailwhip: ["3L6"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L10"], + waterpulse: ["3M"], + }, + }, + azumarill: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + bubblebeam: ["3L24"], + defensecurl: ["3T", "3L1"], + dig: ["3M"], + dive: ["3M"], + doubleedge: ["3T", "3L34"], + doubleteam: ["3M"], + facade: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + hydropump: ["3L57"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M", "3L45"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + rollout: ["3T", "3L15"], + secretpower: ["3M"], + seismictoss: ["3T"], + strength: ["3M"], + substitute: ["3T"], + surf: ["3M"], + tackle: ["3L1"], + tailwhip: ["3L1"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L1"], + waterpulse: ["3M"], + }, + }, + hoppip: { + learnset: { + aerialace: ["3M"], + amnesia: ["3E"], + attract: ["3M"], + bulletseed: ["3M"], + confusion: ["3E"], + cottonspore: ["3L25"], + doubleedge: ["3T", "3E"], + doubleteam: ["3M"], + encore: ["3E"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + hiddenpower: ["3M"], + leechseed: ["3L20"], + megadrain: ["3L30"], + mimic: ["3T"], + poisonpowder: ["3L13"], + protect: ["3M"], + reflect: ["3E"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + sleeppowder: ["3L17"], + solarbeam: ["3M"], + splash: ["3L1"], + stunspore: ["3L15"], + substitute: ["3T"], + sunnyday: ["3M"], + swordsdance: ["3T"], + synthesis: ["3L5"], + tackle: ["3L10"], + tailwhip: ["3L5"], + toxic: ["3M"], + }, + }, + skiploom: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + bulletseed: ["3M"], + cottonspore: ["3L29"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + hiddenpower: ["3M"], + leechseed: ["3L22"], + megadrain: ["3L36"], + mimic: ["3T"], + poisonpowder: ["3L13"], + protect: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + sleeppowder: ["3L17"], + solarbeam: ["3M"], + splash: ["3L1"], + stunspore: ["3L15"], + substitute: ["3T"], + sunnyday: ["3M"], + swordsdance: ["3T"], + synthesis: ["3L1"], + tackle: ["3L1"], + tailwhip: ["3L1"], + toxic: ["3M"], + }, + }, + jumpluff: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + bulletseed: ["3M"], + cottonspore: ["3L33"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + gigadrain: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + leechseed: ["3L22"], + megadrain: ["3L44"], + mimic: ["3T"], + poisonpowder: ["3L13"], + protect: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + sleeppowder: ["3L17"], + solarbeam: ["3M"], + splash: ["3L1"], + stunspore: ["3L15"], + substitute: ["3T"], + sunnyday: ["3M"], + swordsdance: ["3T"], + synthesis: ["3L1"], + tackle: ["3L1"], + tailwhip: ["3L1"], + toxic: ["3M"], + }, + }, + yanma: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + detect: ["3L25"], + doubleedge: ["3T"], + doubleteam: ["3M", "3L12"], + dreameater: ["3T"], + facade: ["3M"], + flash: ["3M"], + foresight: ["3L1"], + frustration: ["3M"], + gigadrain: ["3M"], + hiddenpower: ["3M"], + hypnosis: ["3L23"], + leechlife: ["3E"], + mimic: ["3T"], + protect: ["3M"], + psychic: ["3M"], + quickattack: ["3L6"], + rest: ["3M"], + return: ["3M"], + reversal: ["3E"], + screech: ["3L49"], + secretpower: ["3M"], + shadowball: ["3M"], + silverwind: ["3E"], + solarbeam: ["3M"], + sonicboom: ["3L17"], + steelwing: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + supersonic: ["3L31"], + tackle: ["3L1"], + thief: ["3M"], + toxic: ["3M"], + uproar: ["3L34"], + whirlwind: ["3E"], + wingattack: ["3L39"], + }, + }, + wooper: { + learnset: { + amnesia: ["3L21"], + ancientpower: ["3E"], + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T", "3E"], + curse: ["3E"], + dig: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M", "3L36"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + hail: ["3M"], + haze: ["3L51"], + hiddenpower: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + mist: ["3L51"], + mudshot: ["3L16"], + protect: ["3M"], + raindance: ["3M", "3L41"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + safeguard: ["3E"], + sandstorm: ["3M"], + secretpower: ["3M"], + slam: ["3L11"], + sludgebomb: ["3M"], + spitup: ["3E"], + stockpile: ["3E"], + substitute: ["3T"], + surf: ["3M"], + swallow: ["3E"], + tailwhip: ["3L1"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L1"], + waterpulse: ["3M"], + yawn: ["3L31"], + }, + }, + quagsire: { + learnset: { + amnesia: ["3L23"], + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + counter: ["3T"], + dig: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M", "3L42"], + facade: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hail: ["3M"], + haze: ["3L61"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + mist: ["3L61"], + mudshot: ["3L16"], + protect: ["3M"], + raindance: ["3M", "3L49"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandstorm: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + slam: ["3L11"], + sludgebomb: ["3M"], + strength: ["3M"], + substitute: ["3T"], + surf: ["3M"], + tailwhip: ["3L1"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L1"], + waterpulse: ["3M"], + yawn: ["3L35"], + }, + }, + murkrow: { + learnset: { + aerialace: ["3M"], + astonish: ["3L9"], + attract: ["3M"], + calmmind: ["3M"], + confuseray: ["3E"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + drillpeck: ["3E"], + facade: ["3M"], + featherdance: ["3E"], + feintattack: ["3L35"], + fly: ["3M"], + frustration: ["3M"], + haze: ["3L22"], + hiddenpower: ["3M"], + meanlook: ["3L48"], + mimic: ["3T"], + mirrormove: ["3E"], + nightshade: ["3L27"], + peck: ["3L1"], + protect: ["3M"], + pursuit: ["3L14"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + shadowball: ["3M"], + snatch: ["3M"], + steelwing: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + taunt: ["3M", "3L40"], + thief: ["3M"], + thunderwave: ["3T"], + torment: ["3M"], + toxic: ["3M"], + whirlwind: ["3E"], + wingattack: ["3E"], + }, + }, + misdreavus: { + learnset: { + aerialace: ["3M"], + astonish: ["3L11"], + attract: ["3M"], + calmmind: ["3M"], + confuseray: ["3L17"], + destinybond: ["3E"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + growl: ["3L1"], + grudge: ["3L53"], + hiddenpower: ["3M"], + meanlook: ["3L23"], + mimic: ["3T"], + painsplit: ["3L37"], + perishsong: ["3L45"], + protect: ["3M"], + psybeam: ["3L30"], + psychic: ["3M"], + psywave: ["3L1"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + screech: ["3E"], + secretpower: ["3M"], + shadowball: ["3M"], + shockwave: ["3M"], + skillswap: ["3M"], + snatch: ["3M"], + spite: ["3L6"], + substitute: ["3T"], + sunnyday: ["3M"], + taunt: ["3M"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + torment: ["3M"], + toxic: ["3M"], + }, + }, + unown: { + learnset: { + hiddenpower: ["3L1"], + }, + encounters: [ + {generation: 3, level: 25}, + ], + }, + wynaut: { + learnset: { + charm: ["3L1"], + counter: ["3L15"], + destinybond: ["3L15"], + encore: ["3L1"], + mirrorcoat: ["3L15"], + safeguard: ["3L15"], + splash: ["3L1"], + }, + }, + wobbuffet: { + learnset: { + counter: ["3L1"], + destinybond: ["3L1"], + mirrorcoat: ["3L1"], + safeguard: ["3L1"], + }, + }, + dunsparce: { + learnset: { + ancientpower: ["3E"], + attract: ["3M"], + bite: ["3E"], + blizzard: ["3M"], + bodyslam: ["3T"], + calmmind: ["3M"], + counter: ["3T"], + curse: ["3E"], + defensecurl: ["3T", "3L4"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + earthquake: ["3M"], + endeavor: ["3L41"], + facade: ["3M"], + fireblast: ["3M"], + flail: ["3L44"], + flamethrower: ["3M"], + frustration: ["3M"], + glare: ["3L14"], + headbutt: ["3E"], + hiddenpower: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + protect: ["3M"], + pursuit: ["3L24"], + rage: ["3L1"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T", "3E"], + rocksmash: ["3M"], + rocktomb: ["3M"], + rollout: ["3T", "3L21"], + screech: ["3L31"], + secretpower: ["3M"], + shadowball: ["3M"], + shockwave: ["3M"], + solarbeam: ["3M"], + spite: ["3L21"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + takedown: ["3L34"], + thief: ["3M"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + toxic: ["3M"], + waterpulse: ["3M"], + yawn: ["3L11"], + }, + }, + qwilfish: { + learnset: { + attract: ["3M"], + blizzard: ["3M"], + bubblebeam: ["3E"], + destinybond: ["3L45"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flail: ["3E"], + frustration: ["3M"], + hail: ["3M"], + harden: ["3L9"], + haze: ["3E"], + hiddenpower: ["3M"], + hydropump: ["3L37"], + icebeam: ["3M"], + mimic: ["3T"], + minimize: ["3L9"], + pinmissile: ["3L21"], + poisonsting: ["3L1"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + revenge: ["3L25"], + secretpower: ["3M"], + shadowball: ["3M"], + shockwave: ["3M"], + sludgebomb: ["3M"], + spikes: ["3L1"], + substitute: ["3T"], + supersonic: ["3E"], + surf: ["3M"], + swordsdance: ["3T"], + tackle: ["3L1"], + takedown: ["3L33"], + thunderwave: ["3T"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L13"], + waterpulse: ["3M"], + }, + }, + heracross: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M", "3L23"], + bulkup: ["3M"], + counter: ["3T", "3L30"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M"], + endure: ["3T", "3L11"], + facade: ["3M"], + falseswipe: ["3E"], + focuspunch: ["3M"], + frustration: ["3M"], + furyattack: ["3L17"], + harden: ["3E"], + hiddenpower: ["3M"], + hornattack: ["3L6"], + hyperbeam: ["3M"], + leer: ["3L1"], + megahorn: ["3L53"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + reversal: ["3L45"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swordsdance: ["3T"], + tackle: ["3L1"], + takedown: ["3L37"], + thief: ["3M"], + toxic: ["3M"], + }, + }, + sneasel: { + learnset: { + aerialace: ["3M"], + agility: ["3L36"], + attract: ["3M"], + beatup: ["3L57"], + bite: ["3E"], + blizzard: ["3M"], + brickbreak: ["3M"], + calmmind: ["3M"], + counter: ["3T", "3E"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + facade: ["3M"], + fakeout: ["3E"], + feintattack: ["3L22"], + focuspunch: ["3M"], + frustration: ["3M"], + furyswipes: ["3L29"], + hail: ["3M"], + hiddenpower: ["3M"], + icebeam: ["3M"], + icywind: ["3T", "3L43"], + irontail: ["3M"], + leer: ["3L1"], + metalclaw: ["3L64"], + mimic: ["3T"], + protect: ["3M"], + quickattack: ["3L8"], + raindance: ["3M"], + reflect: ["3E"], + rest: ["3M"], + return: ["3M"], + rocksmash: ["3M"], + scratch: ["3L1"], + screech: ["3L15"], + secretpower: ["3M"], + shadowball: ["3M"], + slash: ["3L50"], + snatch: ["3M"], + spite: ["3E"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + surf: ["3M"], + swordsdance: ["3T"], + taunt: ["3M", "3L1"], + thief: ["3M"], + torment: ["3M"], + toxic: ["3M"], + }, + }, + slugma: { + learnset: { + acidarmor: ["3E"], + amnesia: ["3L29"], + attract: ["3M"], + bodyslam: ["3T", "3L50"], + doubleedge: ["3T"], + doubleteam: ["3M"], + ember: ["3L8"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M", "3L36"], + frustration: ["3M"], + harden: ["3L22"], + hiddenpower: ["3M"], + lightscreen: ["3M"], + mimic: ["3T"], + overheat: ["3M"], + protect: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T", "3L43"], + rocksmash: ["3M"], + rockthrow: ["3L15"], + secretpower: ["3M"], + smog: ["3L1"], + substitute: ["3T"], + sunnyday: ["3M"], + toxic: ["3M"], + yawn: ["3L1"], + }, + }, + magcargo: { + learnset: { + amnesia: ["3L29"], + attract: ["3M"], + bodyslam: ["3T", "3L60"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M"], + ember: ["3L1"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M", "3L36"], + frustration: ["3M"], + harden: ["3L22"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + lightscreen: ["3M"], + mimic: ["3T"], + overheat: ["3M"], + protect: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T", "3L48"], + rocksmash: ["3M"], + rockthrow: ["3L1"], + rocktomb: ["3M"], + sandstorm: ["3M"], + secretpower: ["3M"], + smog: ["3L1"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + toxic: ["3M"], + yawn: ["3L1"], + }, + encounters: [ + {generation: 3, level: 25}, + ], + }, + swinub: { + learnset: { + amnesia: ["3L55"], + ancientpower: ["3E"], + attract: ["3M"], + bite: ["3E"], + blizzard: ["3M", "3L46"], + bodyslam: ["3T", "3E"], + dig: ["3M"], + doubleedge: ["3T", "3E"], + doubleteam: ["3M"], + earthquake: ["3M"], + endure: ["3T", "3L19"], + facade: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + icebeam: ["3M"], + lightscreen: ["3M"], + mimic: ["3T"], + mist: ["3L37"], + mudshot: ["3E"], + odorsleuth: ["3L1"], + powdersnow: ["3L10"], + protect: ["3M"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rockslide: ["3T", "3E"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandstorm: ["3M"], + secretpower: ["3M"], + strength: ["3M"], + substitute: ["3T"], + tackle: ["3L1"], + takedown: ["3L28", "3E"], + toxic: ["3M"], + }, + }, + piloswine: { + learnset: { + amnesia: ["3L70"], + attract: ["3M"], + blizzard: ["3M", "3L56"], + bodyslam: ["3T"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M"], + endure: ["3T", "3L1"], + facade: ["3M"], + frustration: ["3M"], + furyattack: ["3L33"], + hail: ["3M"], + hiddenpower: ["3M"], + hornattack: ["3L1"], + hyperbeam: ["3M"], + icebeam: ["3M"], + lightscreen: ["3M"], + mimic: ["3T"], + mist: ["3L42"], + odorsleuth: ["3L1"], + powdersnow: ["3L1"], + protect: ["3M"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandstorm: ["3M"], + secretpower: ["3M"], + strength: ["3M"], + substitute: ["3T"], + takedown: ["3L28"], + toxic: ["3M"], + }, + }, + remoraid: { + learnset: { + attract: ["3M"], + aurorabeam: ["3L22", "3E"], + blizzard: ["3M"], + bubblebeam: ["3L22"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + focusenergy: ["3L33"], + frustration: ["3M"], + haze: ["3E"], + hiddenpower: ["3M"], + hyperbeam: ["3M", "3L55"], + icebeam: ["3M", "3L44"], + lockon: ["3L11"], + mimic: ["3T"], + octazooka: ["3E"], + protect: ["3M"], + psybeam: ["3L22"], + psychic: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + screech: ["3E"], + secretpower: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + supersonic: ["3E"], + surf: ["3M"], + thief: ["3M"], + thunderwave: ["3T", "3E"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L1"], + waterpulse: ["3M"], + }, + }, + octillery: { + learnset: { + attract: ["3M"], + aurorabeam: ["3L22"], + blizzard: ["3M"], + bubblebeam: ["3L22"], + bulletseed: ["3M"], + constrict: ["3L11"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + focusenergy: ["3L38"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M", "3L70"], + icebeam: ["3M", "3L54"], + mimic: ["3T"], + octazooka: ["3L25"], + protect: ["3M"], + psybeam: ["3L22"], + psychic: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + sludgebomb: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + surf: ["3M"], + thief: ["3M"], + thunderwave: ["3T"], + toxic: ["3M"], + waterfall: ["3M"], + watergun: ["3L1"], + waterpulse: ["3M"], + }, + }, + delibird: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + aurorabeam: ["3E"], + blizzard: ["3M"], + bodyslam: ["3T"], + counter: ["3T"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + fly: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hail: ["3M"], + hiddenpower: ["3M"], + icebeam: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + present: ["3L1"], + protect: ["3M"], + quickattack: ["3E"], + raindance: ["3M"], + rapidspin: ["3E"], + rest: ["3M"], + return: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + splash: ["3E"], + substitute: ["3T"], + thief: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + mantine: { + learnset: { + aerialace: ["3M"], + agility: ["3L29"], + attract: ["3M"], + blizzard: ["3M"], + bodyslam: ["3T"], + bubble: ["3L1"], + bubblebeam: ["3L15"], + confuseray: ["3L50"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M"], + facade: ["3M"], + frustration: ["3M"], + hail: ["3M"], + haze: ["3E"], + hiddenpower: ["3M"], + hydropump: ["3E"], + icebeam: ["3M"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3E"], + secretpower: ["3M"], + slam: ["3E"], + substitute: ["3T"], + supersonic: ["3L8"], + surf: ["3M"], + tackle: ["3L1"], + takedown: ["3L22"], + toxic: ["3M"], + twister: ["3E"], + waterfall: ["3M"], + waterpulse: ["3M", "3L43"], + wingattack: ["3L36"], + }, + }, + skarmory: { + learnset: { + aerialace: ["3M"], + agility: ["3L16"], + aircutter: ["3L29"], + attract: ["3M"], + counter: ["3T"], + curse: ["3E"], + cut: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + drillpeck: ["3E"], + facade: ["3M"], + fly: ["3M"], + frustration: ["3M"], + furyattack: ["3L26"], + hiddenpower: ["3M"], + leer: ["3L1"], + metalsound: ["3L45"], + mimic: ["3T"], + peck: ["3L1"], + protect: ["3M"], + pursuit: ["3E"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + sandattack: ["3L10"], + sandstorm: ["3M"], + secretpower: ["3M"], + spikes: ["3L42"], + steelwing: ["3M", "3L32"], + substitute: ["3T"], + sunnyday: ["3M"], + swift: ["3T", "3L13"], + taunt: ["3M"], + thief: ["3M"], + torment: ["3M"], + toxic: ["3M"], + whirlwind: ["3E"], + }, + }, + phanpy: { + learnset: { + ancientpower: ["3E"], + attract: ["3M"], + bodyslam: ["3T", "3E"], + counter: ["3T", "3E"], + defensecurl: ["3T", "3L9"], + doubleedge: ["3T", "3L49"], + doubleteam: ["3M"], + earthquake: ["3M"], + endure: ["3T", "3L41"], + facade: ["3M"], + fissure: ["3E"], + flail: ["3L17"], + focusenergy: ["3E"], + frustration: ["3M"], + growl: ["3L1"], + hiddenpower: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + odorsleuth: ["3L1"], + protect: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rocksmash: ["3M"], + rocktomb: ["3M"], + rollout: ["3T", "3L33"], + sandstorm: ["3M"], + secretpower: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + tackle: ["3L1"], + takedown: ["3L25"], + toxic: ["3M"], + }, + }, + donphan: { + learnset: { + attract: ["3M"], + bodyslam: ["3T"], + counter: ["3T"], + defensecurl: ["3T", "3L9"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M", "3L49"], + facade: ["3M"], + flail: ["3L17"], + frustration: ["3M"], + furyattack: ["3L25"], + growl: ["3L1"], + hiddenpower: ["3M"], + hornattack: ["3L1"], + hyperbeam: ["3M"], + irontail: ["3M"], + mimic: ["3T"], + odorsleuth: ["3L1"], + protect: ["3M"], + rapidspin: ["3L41"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + rollout: ["3T", "3L33"], + sandstorm: ["3M"], + secretpower: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + toxic: ["3M"], + }, + }, + raikou: { + learnset: { + bite: ["3L1"], + bodyslam: ["3T"], + calmmind: ["3M", "3L81"], + crunch: ["3L61"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + flash: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + irontail: ["3M"], + leer: ["3L1"], + mimic: ["3T"], + protect: ["3M"], + quickattack: ["3L31"], + raindance: ["3M"], + reflect: ["3M", "3L51"], + rest: ["3M"], + return: ["3M"], + roar: ["3M", "3L21"], + rocksmash: ["3M"], + sandstorm: ["3M"], + secretpower: ["3M"], + shockwave: ["3M"], + spark: ["3L41"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + thunder: ["3M", "3L71"], + thunderbolt: ["3M"], + thundershock: ["3L11"], + thunderwave: ["3T"], + toxic: ["3M"], + }, + encounters: [ + {generation: 3, level: 40}, + ], + }, + entei: { + learnset: { + bite: ["3L1"], + bodyslam: ["3T"], + calmmind: ["3M", "3L81"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + ember: ["3L11"], + facade: ["3M"], + fireblast: ["3M", "3L71"], + firespin: ["3L31"], + flamethrower: ["3M", "3L51"], + flash: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + irontail: ["3M"], + leer: ["3L1"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M", "3L21"], + rocksmash: ["3M"], + sandstorm: ["3M"], + secretpower: ["3M"], + solarbeam: ["3M"], + stomp: ["3L41"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + swagger: ["3T", "3L61"], + toxic: ["3M"], + }, + encounters: [ + {generation: 3, level: 40}, + ], + }, + suicune: { + learnset: { + aurorabeam: ["3L41"], + bite: ["3L1"], + blizzard: ["3M"], + bodyslam: ["3T"], + bubblebeam: ["3L11"], + calmmind: ["3M", "3L81"], + cut: ["3M"], + dig: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + facade: ["3M"], + frustration: ["3M"], + gust: ["3L31"], + hail: ["3M"], + hiddenpower: ["3M"], + hydropump: ["3L71"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + leer: ["3L1"], + mimic: ["3T"], + mirrorcoat: ["3L61"], + mist: ["3L51"], + protect: ["3M"], + raindance: ["3M", "3L21"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rocksmash: ["3M"], + sandstorm: ["3M"], + secretpower: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + surf: ["3M"], + toxic: ["3M"], + waterfall: ["3M"], + waterpulse: ["3M"], + }, + encounters: [ + {generation: 3, level: 40}, + ], + }, + larvitar: { + learnset: { + attract: ["3M"], + bite: ["3L1"], + bodyslam: ["3T"], + brickbreak: ["3M"], + crunch: ["3L43"], + curse: ["3E"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dragondance: ["3E"], + earthquake: ["3M", "3L50"], + facade: ["3M"], + focusenergy: ["3E"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M", "3L57"], + leer: ["3L1"], + mimic: ["3T"], + outrage: ["3E"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T", "3L22"], + rocksmash: ["3M"], + sandstorm: ["3M", "3L8"], + scaryface: ["3L36"], + screech: ["3L15"], + secretpower: ["3M"], + stomp: ["3E"], + substitute: ["3T"], + sunnyday: ["3M"], + taunt: ["3M"], + thrash: ["3L29"], + torment: ["3M"], + toxic: ["3M"], + }, + }, + pupitar: { + learnset: { + attract: ["3M"], + bite: ["3L1"], + bodyslam: ["3T"], + brickbreak: ["3M"], + crunch: ["3L47"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + earthquake: ["3M", "3L56"], + facade: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M", "3L65"], + leer: ["3L1"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T", "3L22"], + rocksmash: ["3M"], + sandstorm: ["3M", "3L1"], + scaryface: ["3L38"], + screech: ["3L1"], + secretpower: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + taunt: ["3M"], + thrash: ["3L29"], + torment: ["3M"], + toxic: ["3M"], + }, + }, + tyranitar: { + learnset: { + aerialace: ["3M"], + attract: ["3M"], + bite: ["3L1"], + blizzard: ["3M"], + bodyslam: ["3T"], + brickbreak: ["3M"], + counter: ["3T"], + crunch: ["3L47"], + cut: ["3M"], + dig: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dragonclaw: ["3M"], + earthquake: ["3M", "3L61"], + facade: ["3M"], + fireblast: ["3M"], + flamethrower: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M", "3L75"], + icebeam: ["3M"], + irontail: ["3M"], + leer: ["3L1"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + protect: ["3M"], + raindance: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rockslide: ["3T", "3L22"], + rocksmash: ["3M"], + rocktomb: ["3M"], + sandstorm: ["3M", "3L1"], + scaryface: ["3L38"], + screech: ["3L1"], + secretpower: ["3M"], + seismictoss: ["3T"], + shockwave: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + surf: ["3M"], + taunt: ["3M"], + thrash: ["3L29"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + torment: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + }, + }, + lugia: { + learnset: { + aerialace: ["3M"], + aeroblast: ["3L77"], + ancientpower: ["3L88"], + blizzard: ["3M"], + bodyslam: ["3T"], + calmmind: ["3M"], + dive: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + earthquake: ["3M"], + facade: ["3M"], + fly: ["3M"], + frustration: ["3M"], + futuresight: ["3L99"], + gigadrain: ["3M"], + gust: ["3L22"], + hail: ["3M"], + hiddenpower: ["3M"], + hydropump: ["3L44"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irontail: ["3M"], + lightscreen: ["3M"], + mimic: ["3T"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M", "3L55"], + recover: ["3L33"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rocksmash: ["3M"], + safeguard: ["3M", "3L11"], + sandstorm: ["3M"], + secretpower: ["3M"], + shadowball: ["3M"], + shockwave: ["3M"], + skillswap: ["3M"], + steelwing: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + surf: ["3M"], + swift: ["3T", "3L66"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + toxic: ["3M"], + waterfall: ["3M"], + waterpulse: ["3M"], + whirlwind: ["3L1"], + }, + }, + hooh: { + learnset: { + aerialace: ["3M"], + ancientpower: ["3L88"], + calmmind: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M"], + dreameater: ["3T"], + earthquake: ["3M"], + facade: ["3M"], + fireblast: ["3M", "3L44"], + flamethrower: ["3M"], + flash: ["3M"], + fly: ["3M"], + frustration: ["3M"], + futuresight: ["3L99"], + gigadrain: ["3M"], + gust: ["3L22"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + lightscreen: ["3M"], + mimic: ["3T"], + overheat: ["3M"], + protect: ["3M"], + psychic: ["3M"], + raindance: ["3M"], + recover: ["3L33"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + roar: ["3M"], + rocksmash: ["3M"], + sacredfire: ["3L77"], + safeguard: ["3M", "3L11"], + sandstorm: ["3M"], + secretpower: ["3M"], + shadowball: ["3M"], + shockwave: ["3M"], + solarbeam: ["3M"], + steelwing: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M", "3L55"], + swift: ["3T", "3L66"], + thunder: ["3M"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + toxic: ["3M"], + whirlwind: ["3L1"], + }, + }, + deoxysattack: { + learnset: { + aerialace: ["3M"], + agility: ["3L35"], + bodyslam: ["3T"], + brickbreak: ["3M"], + calmmind: ["3M"], + cosmicpower: ["3L35"], + counter: ["3T"], + cut: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M", "3L10"], + dreameater: ["3T"], + facade: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3L50", "3M"], + icebeam: ["3M"], + leer: ["3L1"], + lightscreen: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + nightshade: ["3L5"], + protect: ["3M"], + psychic: ["3M", "3L25"], + psychoboost: ["3L45"], + pursuit: ["3L20"], + raindance: ["3M"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + safeguard: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + skillswap: ["3M"], + snatch: ["3M"], + solarbeam: ["3M"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + superpower: ["3L30"], + taunt: ["3L15", "3M"], + teleport: ["3L10"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + torment: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + wrap: ["3L1"], + zapcannon: ["3L40"], + }, + }, + deoxysdefense: { + learnset: { + aerialace: ["3M"], + agility: ["3L35"], + amnesia: ["3L35"], + bodyslam: ["3T"], + brickbreak: ["3M"], + calmmind: ["3M"], + counter: ["3T", "3L50"], + cut: ["3M"], + doubleedge: ["3T"], + doubleteam: ["3M", "3L10"], + dreameater: ["3T"], + facade: ["3M"], + flash: ["3M"], + focuspunch: ["3M"], + frustration: ["3M"], + hiddenpower: ["3M"], + hyperbeam: ["3M"], + icebeam: ["3M"], + irondefense: ["3L35"], + knockoff: ["3L15"], + leer: ["3L1"], + lightscreen: ["3M"], + megakick: ["3T"], + megapunch: ["3T"], + mimic: ["3T"], + mirrorcoat: ["3L50"], + nightshade: ["3L5"], + protect: ["3M"], + psychic: ["3M", "3L25"], + psychoboost: ["3L45"], + raindance: ["3M"], + recover: ["3L40"], + reflect: ["3M"], + rest: ["3M"], + return: ["3M"], + rockslide: ["3T"], + rocksmash: ["3M"], + rocktomb: ["3M"], + safeguard: ["3M"], + secretpower: ["3M"], + seismictoss: ["3T"], + shadowball: ["3M"], + shockwave: ["3M"], + skillswap: ["3M"], + snatch: ["3L30", "3M"], + solarbeam: ["3M"], + spikes: ["3L20"], + strength: ["3M"], + substitute: ["3T"], + sunnyday: ["3M"], + taunt: ["3M"], + teleport: ["3L10"], + thunderbolt: ["3M"], + thunderwave: ["3T"], + torment: ["3M"], + toxic: ["3M"], + waterpulse: ["3M"], + wrap: ["3L1"], + }, + }, +}; \ No newline at end of file diff --git a/data/mods/gen3frlg/rulesets.ts b/data/mods/gen3frlg/rulesets.ts new file mode 100644 index 0000000000..0dec9020f9 --- /dev/null +++ b/data/mods/gen3frlg/rulesets.ts @@ -0,0 +1,40 @@ +export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { + standard: { + effectType: 'ValidatorRule', + name: 'Standard', + desc: "The standard ruleset for all official Smogon singles tiers (Ubers, OU, etc.)", + ruleset: [ + 'Standard AG', + 'Sleep Clause Mod', 'Switch Priority Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Items Clause', 'Evasion Moves Clause', + ], + }, + standarddraft: { + effectType: 'ValidatorRule', + name: 'Standard Draft', + desc: "The custom Draft League ruleset", + ruleset: [ + 'Obtainable', 'Nickname Clause', 'Beat Up Nicknames Mod', '+Unreleased', 'Sleep Clause Mod', 'OHKO Clause', 'Evasion Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod', + 'One Boost Passer Clause', 'Freeze Clause Mod', 'Accuracy Moves Clause', 'Baton Pass Trap Clause', + ], + banlist: [ + 'Uber', 'Smeargle + Ingrain', 'Swagger', 'Focus Band', 'King\'s Rock', 'Quick Claw', 'Baton Pass + Ancient Power', 'Baton Pass + Silver Wind', + ], + // timer: {starting: 60 * 60, grace: 0, addPerTurn: 10, maxPerTurn: 100, timeoutAutoChoose: true}, + }, + obtainable: { + inherit: true, + onValidateSet(set) { + const species = this.dex.species.get(set.species); + if (['entei', 'raikou', 'suicune'].includes(species.id)) { + if (!set.ivs) set.ivs = { hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31 }; + for (const stat in set.ivs) { + if ((stat === 'atk' && set.ivs[stat] > 7) || (stat !== 'hp' && set.ivs[stat as 'def'] > 0)) { + return [ + `${set.name} must have 7 or fewer Attack IVs and 0 IVs in all other stats except HP, due to the Roaming IVs glitch.`, + ]; + } + } + } + }, + }, +}; diff --git a/data/mods/scootopiav2/scripts.ts b/data/mods/gen3frlg/scripts.ts similarity index 74% rename from data/mods/scootopiav2/scripts.ts rename to data/mods/gen3frlg/scripts.ts index 49611260ed..bc67cbbb16 100644 --- a/data/mods/scootopiav2/scripts.ts +++ b/data/mods/gen3frlg/scripts.ts @@ -1,3 +1,3 @@ export const Scripts: ModdedBattleScriptsData = { - gen: 9, + inherit: 'gen3', }; diff --git a/data/mods/gen3rs/abilities.ts b/data/mods/gen3rs/abilities.ts new file mode 100644 index 0000000000..adfe8653b3 --- /dev/null +++ b/data/mods/gen3rs/abilities.ts @@ -0,0 +1,63 @@ +function attemptStatuses(battle: Battle, target: Pokemon, source: Pokemon, move: ActiveMove, status: string) { + const attackerStatused = source.trySetStatus(status, target); + if (move.multihit && move.id !== 'triplekick' && + (move.lastHit || (attackerStatused && status === 'slp')) && + battle.randomChance(1, 100)) { + const defenderStatused = target.trySetStatus(status, target, move); + if (defenderStatused) { + battle.hint("In Pokemon Ruby, Sapphire, FireRed, LeafGreen, and Colosseum, if the final hit of a multihit move (except for Triple Kick) that makes contact triggers an ability that inflicts status, then there is a 1% chance that the defender is afflicted by the same status."); + } + } +} + +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { + effectspore: { + inherit: true, + onDamagingHit(damage, target, source, move) { + if (damage && move.flags['contact'] && !source.status) { + const r = this.random(300); + let status = null; + if (r < 10) { + status = 'slp'; + } else if (r < 20) { + status = 'par'; + } else if (r < 30) { + status = 'psn'; + } + if (status) { + attemptStatuses(this, target, source, move, status); + } + } + }, + }, + flamebody: { + inherit: true, + onDamagingHit(damage, target, source, move) { + if (damage && move.flags['contact']) { + if (this.randomChance(1, 3)) { + attemptStatuses(this, target, source, move, 'brn'); + } + } + }, + }, + poisonpoint: { + inherit: true, + onDamagingHit(damage, target, source, move) { + if (damage && move.flags['contact']) { + if (this.randomChance(1, 3)) { + attemptStatuses(this, target, source, move, 'psn'); + } + } + }, + }, + static: { + inherit: true, + onDamagingHit(damage, target, source, move) { + if (damage && move.flags['contact']) { + if (this.randomChance(1, 3)) { + attemptStatuses(this, target, source, move, 'par'); + } + } + }, + }, +}; diff --git a/data/mods/gen3rs/items.ts b/data/mods/gen3rs/items.ts index 8e87d4c7e8..33b884939b 100644 --- a/data/mods/gen3rs/items.ts +++ b/data/mods/gen3rs/items.ts @@ -7,10 +7,6 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { inherit: true, isNonstandard: "Unobtainable", }, - enigmaberry: { - inherit: true, - isNonstandard: "Unobtainable", - }, fastball: { inherit: true, isNonstandard: "Unobtainable", 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/abilities.ts b/data/mods/gen4/abilities.ts index e1af9904bf..434d3a876d 100644 --- a/data/mods/gen4/abilities.ts +++ b/data/mods/gen4/abilities.ts @@ -1,7 +1,7 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { airlock: { inherit: true, - onSwitchIn() {}, + onSwitchIn: undefined, // no inherit onStart(pokemon) { pokemon.abilityState.ending = false; }, @@ -23,6 +23,9 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa onResidualSubOrder: 10, }, blaze: { + inherit: true, + onModifyAtk: undefined, // no inherit + onModifySpA: undefined, // no inherit onBasePowerPriority: 2, onBasePower(basePower, attacker, defender, move) { if (move.type === 'Fire' && attacker.hp <= attacker.maxhp / 3) { @@ -30,13 +33,10 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa return this.chainModify(1.5); } }, - name: "Blaze", - rating: 2, - num: 66, }, cloudnine: { inherit: true, - onSwitchIn() {}, + onSwitchIn: undefined, // no inherit onStart(pokemon) { pokemon.abilityState.ending = false; }, @@ -51,14 +51,14 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa this.add('-start', target, 'typechange', type, '[from] ability: Color Change'); } }, - onAfterMoveSecondary() {}, + onAfterMoveSecondary: undefined, // no inherit }, compoundeyes: { onSourceModifyAccuracyPriority: 9, onSourceModifyAccuracy(accuracy) { if (typeof accuracy !== 'number') return; this.debug('compoundeyes - enhancing accuracy'); - return accuracy * 1.3; + return this.chainModify(1.3); }, inherit: true, }, @@ -92,15 +92,9 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa effectspore: { inherit: true, onDamagingHit(damage, target, source, move) { - if (damage && move.flags['contact'] && !source.status) { - const r = this.random(100); - if (r < 10) { - source.setStatus('slp', target); - } else if (r < 20) { - source.setStatus('par', target); - } else if (r < 30) { - source.setStatus('psn', target); - } + if (damage && move.flags['contact'] && this.randomChance(3, 10)) { + const status = this.sample(['slp', 'par', 'psn']); + source.trySetStatus(status, target); } }, }, @@ -128,19 +122,15 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa } }, condition: { - noCopy: true, // doesn't get copied by Baton Pass - onStart(target) { - this.add('-start', target, 'ability: Flash Fire'); - }, + inherit: true, + onModifyAtk: undefined, // no inherit + onModifySpA: undefined, // no inherit onModifyDamagePhase1(atk, attacker, defender, move) { if (move.type === 'Fire') { this.debug('Flash Fire boost'); return this.chainModify(1.5); } }, - onEnd(target) { - this.add('-end', target, 'ability: Flash Fire', '[silent]'); - }, }, }, flowergift: { @@ -200,20 +190,19 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa onSourceModifyAccuracyPriority: 7, onSourceModifyAccuracy(accuracy, target, source, move) { if (move.category === 'Physical' && typeof accuracy === 'number') { - return accuracy * 0.8; + return this.chainModify(0.8); } }, }, hydration: { + inherit: true, + onResidual: undefined, // no inherit onWeather(target, source, effect) { if (effect.id === 'raindance' && target.status) { this.add('-activate', target, 'ability: Hydration'); target.cureStatus(); } }, - name: "Hydration", - rating: 1.5, - num: 93, }, insomnia: { inherit: true, @@ -255,7 +244,7 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa }, lightningrod: { inherit: true, - onTryHit() {}, + onTryHit: undefined, // no inherit rating: 0, }, liquidooze: { @@ -270,35 +259,33 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa }, }, magicguard: { - onDamage(damage, target, source, effect) { - if (effect.effectType !== 'Move') { - return false; - } - }, + inherit: true, onSetStatus(status, target, source, effect) { if (effect && effect.id === 'toxicspikes') { return false; } }, - name: "Magic Guard", rating: 4.5, - num: 98, }, minus: { + inherit: true, + onModifySpAPriority: undefined, // no inherit onModifySpA(spa, pokemon) { - for (const ally of pokemon.allies()) { - if (ally.ability === 'plus') { - return spa * 1.5; + for (const allyActive of pokemon.allies()) { + if (allyActive.hasAbility('plus')) { + return this.chainModify(1.5); } } }, - name: "Minus", - rating: 0, - num: 58, + }, + multitype: { + inherit: true, + onTakeItem: false, + onSetAbility: false, // redundant but hardcoded }, naturalcure: { inherit: true, - onCheckShow(pokemon) {}, + onCheckShow: undefined, // no inherit onSwitchOut(pokemon) { if (!pokemon.status || pokemon.status === 'fnt') return; @@ -318,6 +305,9 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa }, }, overgrow: { + inherit: true, + onModifyAtk: undefined, // no inherit + onModifySpA: undefined, // no inherit onBasePowerPriority: 2, onBasePower(basePower, attacker, defender, move) { if (move.type === 'Grass' && attacker.hp <= attacker.maxhp / 3) { @@ -325,26 +315,23 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa return this.chainModify(1.5); } }, - name: "Overgrow", - rating: 2, - num: 65, }, pickup: { - name: "Pickup", + inherit: true, + onResidual: undefined, // no inherit rating: 0, - num: 53, + // No competitive use }, plus: { + inherit: true, + onModifySpAPriority: undefined, // no inherit onModifySpA(spa, pokemon) { - for (const ally of pokemon.allies()) { - if (ally.ability === 'minus') { - return spa * 1.5; + for (const allyActive of pokemon.allies()) { + if (allyActive.hasAbility('minus')) { + return this.chainModify(1.5); } } }, - name: "Plus", - rating: 0, - num: 57, }, poisonpoint: { inherit: true, @@ -357,16 +344,12 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa }, }, pressure: { - onStart(pokemon) { - this.add('-ability', pokemon, 'Pressure'); - }, + inherit: true, onDeductPP(target, source) { if (target === source) return; return 1; }, - name: "Pressure", rating: 1.5, - num: 46, }, roughskin: { inherit: true, @@ -383,7 +366,7 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa if (typeof accuracy !== 'number') return; if (this.field.isWeather('sandstorm')) { this.debug('Sand Veil - decreasing accuracy'); - return accuracy * 0.8; + return this.chainModify(0.8); } }, }, @@ -404,16 +387,14 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa onResidualSubOrder: 3, }, simple: { + inherit: true, + onChangeBoost: undefined, // no inherit onModifyBoost(boosts) { let key: BoostID; for (key in boosts) { boosts[key]! *= 2; } }, - flags: { breakable: 1 }, - name: "Simple", - rating: 4, - num: 86, }, snowcloak: { inherit: true, @@ -422,7 +403,7 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa if (typeof accuracy !== 'number') return; if (this.field.isWeather('hail')) { this.debug('Snow Cloak - decreasing accuracy'); - return accuracy * 0.8; + return this.chainModify(0.8); } }, }, @@ -431,6 +412,13 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa onResidualOrder: 10, onResidualSubOrder: 3, }, + stall: { + inherit: true, + onFractionalPriority(priority, pokemon) { + // don't override Lagging Tail and Full Incense's -0.2 fractional priority + if (priority >= 0) return -0.1; + }, + }, static: { inherit: true, onDamagingHit(damage, target, source, move) { @@ -442,9 +430,10 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa }, }, stench: { - name: "Stench", + inherit: true, + onModifyMove: undefined, // no inherit rating: 0, - num: 1, + // No competitive use }, stickyhold: { inherit: true, @@ -457,15 +446,18 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa }, stormdrain: { inherit: true, - onTryHit() {}, + onTryHit: undefined, // no inherit rating: 0, }, sturdy: { inherit: true, - onDamage() {}, + onDamage: undefined, // no inherit rating: 0, }, swarm: { + inherit: true, + onModifyAtk: undefined, // no inherit + onModifySpA: undefined, // no inherit onBasePowerPriority: 2, onBasePower(basePower, attacker, defender, move) { if (move.type === 'Bug' && attacker.hp <= attacker.maxhp / 3) { @@ -473,9 +465,6 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa return this.chainModify(1.5); } }, - name: "Swarm", - rating: 2, - num: 68, }, synchronize: { inherit: true, @@ -495,23 +484,25 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa if (typeof accuracy !== 'number') return; if (target?.volatiles['confusion']) { this.debug('Tangled Feet - decreasing accuracy'); - return accuracy * 0.5; + return this.chainModify(0.5); } }, }, thickfat: { + inherit: true, + onSourceModifyAtk: undefined, // no inherit + onSourceModifySpA: undefined, // no inherit onSourceBasePowerPriority: 1, onSourceBasePower(basePower, attacker, defender, move) { if (move.type === 'Ice' || move.type === 'Fire') { return this.chainModify(0.5); } }, - flags: { breakable: 1 }, - name: "Thick Fat", - rating: 3.5, - num: 47, }, torrent: { + inherit: true, + onModifyAtk: undefined, // no inherit + onModifySpA: undefined, // no inherit onBasePowerPriority: 2, onBasePower(basePower, attacker, defender, move) { if (move.type === 'Water' && attacker.hp <= attacker.maxhp / 3) { @@ -519,9 +510,6 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa return this.chainModify(1.5); } }, - name: "Torrent", - rating: 2, - num: 67, }, trace: { inherit: true, @@ -530,10 +518,7 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa const target = pokemon.side.randomFoe(); if (!target || target.fainted) return; const ability = target.getAbility(); - const bannedAbilities = ['forecast', 'multitype', 'trace']; - if (bannedAbilities.includes(target.ability)) { - return; - } + if (ability.flags['notrace']) return; pokemon.setAbility(ability, target); }, flags: { notrace: 1 }, @@ -559,6 +544,6 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa }, rebound: { inherit: true, - onTryHitSide() {}, + onTryHitSide: undefined, // no inherit }, }; diff --git a/data/mods/gen4/conditions.ts b/data/mods/gen4/conditions.ts index 116a067c80..1f1d1a2dae 100644 --- a/data/mods/gen4/conditions.ts +++ b/data/mods/gen4/conditions.ts @@ -118,7 +118,7 @@ export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDa }, lockedmove: { inherit: true, - onAfterMove() {}, + onAfterMove: undefined, // no inherit }, choicelock: { inherit: true, diff --git a/data/mods/gen4/items.ts b/data/mods/gen4/items.ts index 1a5577d4aa..bec40c7413 100644 --- a/data/mods/gen4/items.ts +++ b/data/mods/gen4/items.ts @@ -32,24 +32,24 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, choiceband: { inherit: true, - onStart() {}, - onModifyMove() {}, + onStart: undefined, // no inherit + onModifyMove: undefined, // no inherit onAfterMove(pokemon) { pokemon.addVolatile('choicelock'); }, }, choicescarf: { inherit: true, - onStart() {}, - onModifyMove() {}, + onStart: undefined, // no inherit + onModifyMove: undefined, // no inherit onAfterMove(pokemon) { pokemon.addVolatile('choicelock'); }, }, choicespecs: { inherit: true, - onStart() {}, - onModifyMove() {}, + onStart: undefined, // no inherit + onModifyMove: undefined, // no inherit onAfterMove(pokemon) { pokemon.addVolatile('choicelock'); }, @@ -72,7 +72,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, custapberry: { inherit: true, - onFractionalPriority() {}, + onFractionalPriority: undefined, // no inherit onBeforeTurn(pokemon) { if (pokemon.hp <= pokemon.maxhp / 4 || (pokemon.hp <= pokemon.maxhp / 2 && pokemon.ability === 'gluttony')) { const action = this.queue.willMove(pokemon); @@ -144,7 +144,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, focussash: { inherit: true, - onDamage() { }, + onDamage: undefined, // no inherit onTryHit(target, source, move) { if (target !== source && target.hp === target.maxhp) { target.addVolatile('focussash'); @@ -164,6 +164,11 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, }, }, + fullincense: { + inherit: true, + onFractionalPriorityPriority: 1, + onFractionalPriority: -0.2, + }, griseousorb: { inherit: true, onBasePower(basePower, user, target, move) { @@ -171,6 +176,8 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { return this.chainModify(1.2); } }, + onTakeItem: false, + onSetAbility: false, }, heavyball: { inherit: true, @@ -186,7 +193,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, ironball: { inherit: true, - onEffectiveness() {}, + onEffectiveness: undefined, // no inherit }, ironplate: { inherit: true, @@ -207,6 +214,11 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { } }, }, + laggingtail: { + inherit: true, + onFractionalPriorityPriority: 1, + onFractionalPriority: -0.2, + }, laxincense: { inherit: true, onModifyAccuracyPriority: 5, @@ -227,8 +239,8 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, lifeorb: { inherit: true, - onModifyDamage() {}, - onAfterMoveSecondarySelf() {}, + onModifyDamage: undefined, // no inherit + onAfterMoveSecondarySelf: undefined, // no inherit onBasePower(basePower, user, target) { if (!target.volatiles['substitute']) { user.addVolatile('lifeorb'); @@ -250,8 +262,8 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, lightball: { inherit: true, - onModifyAtk() {}, - onModifySpA() {}, + onModifyAtk: undefined, // no inherit + onModifySpA: undefined, // no inherit onBasePower(basePower, pokemon) { if (pokemon.species.name === 'Pikachu') { return this.chainModify(2); @@ -306,11 +318,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { metronome: { inherit: true, condition: { - onStart(pokemon) { - this.effectState.numConsecutive = 0; - this.effectState.lastMove = ''; - }, - onTryMovePriority: -2, + inherit: true, onTryMove(pokemon, target, move) { if (!pokemon.hasItem('metronome')) { pokemon.removeVolatile('metronome'); @@ -323,6 +331,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { } this.effectState.lastMove = move.id; }, + onModifyDamage: undefined, // no inherit onModifyDamagePhase2(damage, source, target, move) { return damage * (1 + (this.effectState.numConsecutive / 10)); }, @@ -331,7 +340,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { micleberry: { inherit: true, condition: { - duration: 2, + inherit: true, onSourceModifyAccuracyPriority: 3, onSourceModifyAccuracy(accuracy, target, source) { this.add('-enditem', source, 'Micle Berry'); diff --git a/data/mods/gen4/moves.ts b/data/mods/gen4/moves.ts index d6ad9cf3c5..795aa6e7c8 100644 --- a/data/mods/gen4/moves.ts +++ b/data/mods/gen4/moves.ts @@ -37,14 +37,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, flags: { metronome: 1 }, condition: { - onStart(pokemon) { - this.add('-start', pokemon, 'Aqua Ring'); - }, + inherit: true, onResidualOrder: 10, onResidualSubOrder: 2, - onResidual(pokemon) { - this.heal(pokemon.baseMaxhp / 16); - }, }, }, assist: { @@ -92,8 +87,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { duration: 1, onModifyAtkPriority: -101, onModifyAtk(atk, pokemon, defender, move) { - // https://www.smogon.com/forums/posts/8992145/ - // this.add('-activate', pokemon, 'move: Beat Up', '[of] ' + move.allies![0].name); + if (!this.ruleTable.has('beatupnicknamesmod')) { + this.add('-activate', pokemon, 'move: Beat Up', '[of] ' + move.allies![0].name); + } this.event.modifier = 1; return this.dex.species.get(move.allies!.shift()!.set.species).baseStats.atk; }, @@ -107,18 +103,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { bide: { inherit: true, condition: { - duration: 3, - onLockMove: 'bide', - onStart(pokemon) { - this.effectState.totalDamage = 0; - this.add('-start', pokemon, 'move: Bide'); - }, - onDamagePriority: -101, - onDamage(damage, target, source, move) { - if (!move || move.effectType !== 'Move' || !source) return; - this.effectState.totalDamage += damage; - this.effectState.lastDamageSource = source; - }, + inherit: true, onAfterSetStatus(status, pokemon) { if (status.id === 'slp' || status.id === 'frz') { pokemon.removeVolatile('bide'); @@ -162,12 +147,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } this.add('-activate', pokemon, 'move: Bide'); }, - onMoveAborted(pokemon) { - pokemon.removeVolatile('bide'); - }, - onEnd(pokemon) { - this.add('-end', pokemon, 'move: Bide', '[silent]'); - }, }, }, bind: { @@ -301,14 +280,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, condition: { - onStart(pokemon, source) { - this.add('-start', pokemon, 'Curse', `[of] ${source}`); - }, + inherit: true, onResidualOrder: 10, onResidualSubOrder: 8, - onResidual(pokemon) { - this.damage(pokemon.baseMaxhp / 4); - }, }, type: "???", }, @@ -319,36 +293,17 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { detect: { inherit: true, priority: 3, - condition: { - duration: 1, - onStart(target) { - this.add('-singleturn', target, 'Protect'); - }, - onTryHitPriority: 3, - onTryHit(target, source, move) { - if (!move.flags['protect']) return; - this.add('-activate', target, 'Protect'); - const lockedmove = source.getVolatile('lockedmove'); - if (lockedmove) { - // Outrage counter is NOT reset - if (source.volatiles['lockedmove'].trueDuration >= 2) { - source.volatiles['lockedmove'].duration = 2; - } - } - return null; - }, - }, }, disable: { inherit: true, accuracy: 80, flags: { protect: 1, mirror: 1, bypasssub: 1, metronome: 1 }, - volatileStatus: 'disable', condition: { + inherit: true, + duration: undefined, // no inherit durationCallback() { return this.random(4, 8); }, - noCopy: true, onStart(pokemon) { if (!this.queue.willMove(pokemon)) { this.effectState.duration!++; @@ -371,23 +326,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, onResidualOrder: 10, onResidualSubOrder: 13, - onEnd(pokemon) { - this.add('-end', pokemon, 'move: Disable'); - }, - onBeforeMovePriority: 7, - onBeforeMove(attacker, defender, move) { - if (move.id === this.effectState.move) { - this.add('cant', attacker, 'Disable', move); - return false; - } - }, - onDisableMove(pokemon) { - for (const moveSlot of pokemon.moveSlots) { - if (moveSlot.id === this.effectState.move) { - pokemon.disableMove(moveSlot.id); - } - } - }, }, }, doomdesire: { @@ -449,16 +387,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, condition: { - duration: 5, - onStart(pokemon) { - this.add('-start', pokemon, 'Embargo'); - }, - // Item suppression implemented in Pokemon.ignoringItem() within sim/pokemon.js + inherit: true, onResidualOrder: 10, onResidualSubOrder: 18, - onEnd(pokemon) { - this.add('-end', pokemon, 'Embargo'); - }, }, }, encore: { @@ -466,43 +397,13 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { flags: { protect: 1, mirror: 1, bypasssub: 1, metronome: 1, failencore: 1 }, volatileStatus: 'encore', condition: { + inherit: true, + duration: undefined, // no inherit durationCallback() { return this.random(4, 9); }, - onStart(target, source) { - const moveSlot = target.lastMove ? target.getMoveData(target.lastMove.id) : null; - if (!target.lastMove || target.lastMove.flags['failencore'] || !moveSlot || moveSlot.pp <= 0) { - // it failed - return false; - } - this.effectState.move = target.lastMove.id; - this.add('-start', target, 'Encore'); - }, - onOverrideAction(pokemon) { - return this.effectState.move; - }, onResidualOrder: 10, onResidualSubOrder: 14, - onResidual(target) { - const moveSlot = target.getMoveData(this.effectState.move); - if (moveSlot && moveSlot.pp <= 0) { - // early termination if you run out of PP - target.removeVolatile('encore'); - } - }, - onEnd(target) { - this.add('-end', target, 'Encore'); - }, - onDisableMove(pokemon) { - if (!this.effectState.move || !pokemon.hasMove(this.effectState.move)) { - return; - } - for (const moveSlot of pokemon.moveSlots) { - if (moveSlot.id !== this.effectState.move) { - pokemon.disableMove(moveSlot.id); - } - } - }, }, }, endeavor: { @@ -567,7 +468,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, onPrepareHit(target, source, move) { if (source.ignoringItem(true)) return false; - if (source.hasAbility('multitype')) return false; const item = source.getItem(); if (!this.singleEvent('TakeItem', item, source.itemState, source, source, move, item)) return false; if (!item.fling) return false; @@ -596,11 +496,11 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, focuspunch: { inherit: true, - priorityChargeCallback() {}, + priorityChargeCallback: undefined, // no inherit beforeTurnCallback(pokemon) { pokemon.addVolatile('focuspunch'); }, - beforeMoveCallback() {}, + beforeMoveCallback: undefined, // no inherit onTry(pokemon) { if (pokemon.volatiles['focuspunch']?.lostFocus) { this.attrLastMove('[still]'); @@ -617,10 +517,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, basePower: 10, condition: { - duration: 2, - onStart() { - this.effectState.multiplier = 1; - }, + inherit: true, onRestart() { if (this.effectState.multiplier < 16) { this.effectState.multiplier <<= 1; @@ -676,82 +573,14 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { gravity: { inherit: true, condition: { - duration: 5, - durationCallback(source, effect) { - if (source?.hasAbility('persistent')) { - this.add('-activate', source, 'ability: Persistent', '[move] Gravity'); - return 7; - } - return 5; - }, - onFieldStart(target, source) { - if (source?.hasAbility('persistent')) { - this.add('-fieldstart', 'move: Gravity', '[persistent]'); - } else { - this.add('-fieldstart', 'move: Gravity'); - } - for (const pokemon of this.getAllActive()) { - let applies = false; - if (pokemon.removeVolatile('bounce') || pokemon.removeVolatile('fly')) { - applies = true; - this.queue.cancelMove(pokemon); - pokemon.removeVolatile('twoturnmove'); - } - if (pokemon.volatiles['skydrop']) { - applies = true; - this.queue.cancelMove(pokemon); - - if (pokemon.volatiles['skydrop'].source) { - this.add('-end', pokemon.volatiles['twoturnmove'].source, 'Sky Drop', '[interrupt]'); - } - pokemon.removeVolatile('skydrop'); - pokemon.removeVolatile('twoturnmove'); - } - if (pokemon.volatiles['magnetrise']) { - applies = true; - delete pokemon.volatiles['magnetrise']; - } - if (pokemon.volatiles['telekinesis']) { - applies = true; - delete pokemon.volatiles['telekinesis']; - } - if (applies) this.add('-activate', pokemon, 'move: Gravity'); - } - }, - onModifyAccuracy(accuracy) { - if (typeof accuracy !== 'number') return; - return this.chainModify([6840, 4096]); - }, - onDisableMove(pokemon) { - for (const moveSlot of pokemon.moveSlots) { - if (this.dex.moves.get(moveSlot.id).flags['gravity']) { - pokemon.disableMove(moveSlot.id); - } - } - }, - // groundedness implemented in battle.engine.js:BattlePokemon#isGrounded - onBeforeMovePriority: 6, - onBeforeMove(pokemon, target, move) { - if (move.flags['gravity'] && !move.isZ) { - this.add('cant', pokemon, 'move: Gravity', move); - return false; - } - }, - onModifyMove(move, pokemon, target) { - if (move.flags['gravity'] && !move.isZ) { - this.add('cant', pokemon, 'move: Gravity', move); - return false; - } - }, + inherit: true, onFieldResidualOrder: 9, - onFieldEnd() { - this.add('-fieldend', 'move: Gravity'); - }, + onFieldResidualSubOrder: undefined, // no inherit }, }, growth: { inherit: true, - onModifyMove() {}, + onModifyMove: undefined, // no inherit boosts: { spa: 1, }, @@ -784,36 +613,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, flags: { protect: 1, mirror: 1, metronome: 1 }, condition: { - duration: 5, - durationCallback(target, source, effect) { - if (source?.hasAbility('persistent')) { - this.add('-activate', source, 'ability: Persistent', '[move] Heal Block'); - return 7; - } - return 5; - }, - onStart(pokemon) { - this.add('-start', pokemon, 'move: Heal Block'); - }, - onDisableMove(pokemon) { - for (const moveSlot of pokemon.moveSlots) { - if (this.dex.moves.get(moveSlot.id).flags['heal']) { - pokemon.disableMove(moveSlot.id); - } - } - }, - onBeforeMovePriority: 6, - onBeforeMove(pokemon, target, move) { - if (move.flags['heal']) { - this.add('cant', pokemon, 'move: Heal Block', move); - return false; - } - }, + inherit: true, onResidualOrder: 10, onResidualSubOrder: 17, - onEnd(pokemon) { - this.add('-end', pokemon, 'move: Heal Block'); - }, onTryHeal(damage, pokemon, source, effect) { if (effect && (effect.id === 'drain' || effect.id === 'leechseed' || effect.id === 'wish')) { return false; @@ -873,22 +675,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { ingrain: { inherit: true, condition: { - onStart(pokemon) { - this.add('-start', pokemon, 'move: Ingrain'); - }, + inherit: true, onResidualOrder: 10, onResidualSubOrder: 1, - onResidual(pokemon) { - this.heal(pokemon.baseMaxhp / 16); - }, - onTrapPokemon(pokemon) { - pokemon.tryTrap(); - }, - // groundedness implemented in battle.engine.js:BattlePokemon#isGrounded - onDragOut(pokemon) { - this.add('-activate', pokemon, 'move: Ingrain'); - return null; - }, }, }, jumpkick: { @@ -906,7 +695,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, onAfterHit(target, source, move) { if (!target.item) return; - if (target.ability === 'multitype') return; const item = target.getItem(); if (this.runEvent('TakeItem', target, source, move, item)) { target.item = ''; @@ -923,34 +711,16 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { leechseed: { inherit: true, condition: { - onStart(target) { - this.add('-start', target, 'move: Leech Seed'); - }, + inherit: true, onResidualOrder: 10, onResidualSubOrder: 5, - onResidual(pokemon) { - const target = this.getAtSlot(pokemon.volatiles['leechseed'].sourceSlot); - if (!target || target.fainted || target.hp <= 0) { - this.debug('Nothing to leech into'); - return; - } - const damage = this.damage(pokemon.baseMaxhp / 8, pokemon, target); - if (damage) { - this.heal(damage, target, pokemon); - } - }, }, }, lightscreen: { inherit: true, condition: { - duration: 5, - durationCallback(target, source, effect) { - if (source?.hasItem('lightclay')) { - return 8; - } - return 5; - }, + inherit: true, + onAnyModifyDamage: undefined, // no inherit onAnyModifyDamagePhase1(damage, source, target, move) { if (target !== source && this.effectState.target.hasAlly(target) && this.getCategory(move) === 'Special') { if (!target.getMoveHitData(move).crit && !move.infiltrates) { @@ -960,41 +730,24 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } } }, - onSideStart(side) { - this.add('-sidestart', side, 'Light Screen'); - }, onSideResidualOrder: 2, - onSideEnd(side) { - this.add('-sideend', side, 'Light Screen'); - }, + onSideResidualSubOrder: undefined, // no inherit }, }, lockon: { inherit: true, condition: { - duration: 2, - onSourceInvulnerabilityPriority: 1, - onSourceInvulnerability(target, source, move) { - if (move && source === this.effectState.target && target === this.effectState.source) return 0; - }, - onSourceAccuracy(accuracy, target, source, move) { - if (move && source === this.effectState.target && target === this.effectState.source) return true; - }, + inherit: true, + noCopy: false, }, }, luckychant: { inherit: true, flags: { metronome: 1 }, condition: { - duration: 5, - onSideStart(side) { - this.add('-sidestart', side, 'move: Lucky Chant'); - }, - onCriticalHit: false, + inherit: true, onSideResidualOrder: 6, - onSideEnd(side) { - this.add('-sideend', side, 'move: Lucky Chant'); - }, + onSideResidualSubOrder: undefined, // no inherit }, }, lunardance: { @@ -1031,8 +784,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { magiccoat: { inherit: true, condition: { - duration: 1, - onTryHitPriority: 2, + inherit: true, onTryHit(target, source, move) { if (target === source || move.hasBounced || !move.flags['reflectable']) { return; @@ -1043,6 +795,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.actions.useMove(newMove, target, { target: source }); return null; }, + onAllyTryHitSide: undefined, // no inherit }, }, magmastorm: { @@ -1054,25 +807,20 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { flags: { gravity: 1, metronome: 1 }, volatileStatus: 'magnetrise', condition: { - duration: 5, + inherit: true, onStart(target) { if (target.volatiles['ingrain'] || target.ability === 'levitate') return false; this.add('-start', target, 'Magnet Rise'); }, - onImmunity(type) { - if (type === 'Ground') return false; - }, onResidualOrder: 10, onResidualSubOrder: 16, - onEnd(target) { - this.add('-end', target, 'Magnet Rise'); - }, }, }, mefirst: { inherit: true, condition: { - duration: 1, + inherit: true, + onBasePower: undefined, // no inherit onModifyDamagePhase2(damage) { return damage * 1.5; }, @@ -1087,9 +835,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { flags: { noassist: 1, failcopycat: 1, nosleeptalk: 1, failmimic: 1 }, onHit(pokemon) { const moves = this.dex.moves.all().filter(move => ( - (![2, 4].includes(this.gen) || !pokemon.moves.includes(move.id)) && (!move.isNonstandard || move.isNonstandard === 'Unobtainable') && move.flags['metronome'] && + (![2, 4].includes(this.gen) || !pokemon.moves.includes(move.id)) && !(this.field.pseudoWeather['gravity'] && move.flags['gravity']) && !(pokemon.volatiles['healblock'] && move.flags['heal']) )); @@ -1099,7 +847,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { randomMove = this.sample(moves).id; } if (!randomMove) return false; - pokemon.side.lastSelectedMove = this.toID(randomMove); this.actions.useMove(randomMove, pokemon); }, }, @@ -1121,8 +868,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { source.moveSlots[mimicIndex] = { move: move.name, id: move.id, - pp: 5, - maxpp: move.pp * 8 / 5, + pp: Math.min(5, move.pp), + maxpp: this.calculatePP(move, source.ppUps[mimicIndex] || 0), disabled: false, used: false, virtual: true, @@ -1142,7 +889,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, mirrormove: { inherit: true, - onTryHit() {}, + onTryHit: undefined, // no inherit onHit(pokemon) { const lastAttackedBy = pokemon.getLastAttackedBy(); if (!lastAttackedBy?.source.lastMove || !lastAttackedBy.move) { @@ -1161,30 +908,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { mist: { inherit: true, condition: { - duration: 5, - onTryBoost(boost, target, source, effect) { - if (effect.effectType === 'Move' && effect.infiltrates && !target.isAlly(source)) return; - if (source && target !== source) { - let showMsg = false; - let i: BoostID; - for (i in boost) { - if (boost[i]! < 0) { - delete boost[i]; - showMsg = true; - } - } - if (showMsg && !(effect as ActiveMove).secondaries) { - this.add('-activate', target, 'move: Mist'); - } - } - }, - onSideStart(side) { - this.add('-sidestart', side, 'Mist'); - }, + inherit: true, onSideResidualOrder: 3, - onSideEnd(side) { - this.add('-sideend', side, 'Mist'); - }, + onSideResidualSubOrder: undefined, // no inherit }, }, moonlight: { @@ -1214,9 +940,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { mudsport: { inherit: true, condition: { - onStart(pokemon) { - this.add('-start', pokemon, 'move: Mud Sport'); - }, + inherit: true, + noCopy: false, onAnyBasePowerPriority: 3, onAnyBasePower(basePower, user, target, move) { if (move.type === 'Electric') { @@ -1236,18 +961,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { nightmare: { inherit: true, condition: { - noCopy: true, - onStart(pokemon) { - if (pokemon.status !== 'slp' && !pokemon.hasAbility('comatose')) { - return false; - } - this.add('-start', pokemon, 'Nightmare'); - }, + inherit: true, onResidualOrder: 10, onResidualSubOrder: 7, - onResidual(pokemon) { - this.damage(pokemon.baseMaxhp / 4); - }, }, }, odorsleuth: { @@ -1277,16 +993,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { perishsong: { inherit: true, condition: { - duration: 4, - onEnd(target) { - this.add('-start', target, 'perish0'); - target.faint(); - }, + inherit: true, onResidualOrder: 12, - onResidual(pokemon) { - const duration = pokemon.volatiles['perishsong'].duration; - this.add('-start', pokemon, `perish${duration}`); - }, }, }, petaldance: { @@ -1307,13 +1015,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, priority: 3, condition: { - duration: 1, - onStart(target) { - this.add('-singleturn', target, 'Protect'); - }, - onTryHitPriority: 3, + inherit: true, onTryHit(target, source, move) { - if (!move.flags['protect']) return; + if (this.checkMoveBypassesProtect(move, source, target)) return; this.add('-activate', target, 'Protect'); const lockedmove = source.getVolatile('lockedmove'); if (lockedmove) { @@ -1332,8 +1036,20 @@ 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, + inherit: true, onBeforeSwitchOut(pokemon) { this.debug('Pursuit start'); let alreadyAdded = false; @@ -1354,7 +1070,12 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } } } - this.actions.runMove('pursuit', source, source.getLocOf(pokemon)); + const move = this.dex.getActiveMove('pursuit'); + source.deductPP(move.id); + source.moveUsed(move, pokemon.position); + if (this.actions.useMove(move, source, { target: pokemon }) && source.getItem().isChoice) { + source.addVolatile('choicelock'); + } } }, }, @@ -1385,13 +1106,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { reflect: { inherit: true, condition: { - duration: 5, - durationCallback(target, source, effect) { - if (source?.hasItem('lightclay')) { - return 8; - } - return 5; - }, + inherit: true, + onAnyModifyDamage: undefined, // no inherit onAnyModifyDamagePhase1(damage, source, target, move) { if (target !== source && this.effectState.target.hasAlly(target) && this.getCategory(move) === 'Physical') { if (!target.getMoveHitData(move).crit && !move.infiltrates) { @@ -1401,13 +1117,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } } }, - onSideStart(side) { - this.add('-sidestart', side, 'Reflect'); - }, onSideResidualOrder: 1, - onSideEnd(side) { - this.add('-sideend', side, 'Reflect'); - }, + onSideResidualSubOrder: undefined, // no inherit }, }, reversal: { @@ -1440,57 +1151,12 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, accuracy: 80, }, - roleplay: { - inherit: true, - onTryHit(target, source) { - if (target.ability === source.ability || source.hasItem('griseousorb')) return false; - if (target.getAbility().flags['failroleplay'] || source.ability === 'multitype') { - return false; - } - }, - }, safeguard: { inherit: true, condition: { - duration: 5, - durationCallback(target, source, effect) { - if (source?.hasAbility('persistent')) { - this.add('-activate', source, 'ability: Persistent', '[move] Safeguard'); - return 7; - } - return 5; - }, - onSetStatus(status, target, source, effect) { - if (!effect || !source) return; - if (effect.id === 'yawn') return; - if (effect.effectType === 'Move' && effect.infiltrates && !target.isAlly(source)) return; - if (target !== source) { - this.debug('interrupting setStatus'); - if (effect.id === 'synchronize' || (effect.effectType === 'Move' && !effect.secondaries)) { - this.add('-activate', target, 'move: Safeguard'); - } - return null; - } - }, - onTryAddVolatile(status, target, source, effect) { - if (!effect || !source) return; - if (effect.effectType === 'Move' && effect.infiltrates && !target.isAlly(source)) return; - if ((status.id === 'confusion' || status.id === 'yawn') && target !== source) { - if (effect.effectType === 'Move' && !effect.secondaries) this.add('-activate', target, 'move: Safeguard'); - return null; - } - }, - onSideStart(side, source) { - if (source?.hasAbility('persistent')) { - this.add('-sidestart', side, 'Safeguard', '[persistent]'); - } else { - this.add('-sidestart', side, 'Safeguard'); - } - }, + inherit: true, onSideResidualOrder: 4, - onSideEnd(side) { - this.add('-sideend', side, 'Safeguard'); - }, + onSideResidualSubOrder: undefined, // no inherit }, }, sandtomb: { @@ -1529,7 +1195,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { move: move.name, id: move.id, pp: move.pp, - maxpp: move.pp, + maxpp: this.calculatePP(move, source.ppUps[sketchIndex] || 0), disabled: false, used: false, }; @@ -1538,19 +1204,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) { @@ -1561,11 +1214,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, flags: { bypasssub: 1, noassist: 1, failcopycat: 1 }, condition: { - duration: 1, - onStart(pokemon) { - this.add('-singleturn', pokemon, 'Snatch'); - }, - onAnyPrepareHitPriority: -1, + inherit: true, onAnyPrepareHit(source, target, move) { const snatchUser = this.effectState.source; if (snatchUser.isSkyDropped()) return; @@ -1574,9 +1223,15 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } snatchUser.removeVolatile('snatch'); this.add('-activate', snatchUser, 'move: Snatch', `[of] ${source}`); - if (this.actions.useMove(move.id, snatchUser)) { - snatchUser.deductPP('snatch'); + + // check Pressure + const ppDrop = this.runEvent('DeductPP', source, snatchUser, this.effectState.sourceEffect); + const extraPP = ppDrop !== true ? ppDrop : 0; + if (extraPP > 0) { + snatchUser.deductPP(this.effectState.sourceEffect.id, extraPP); } + + this.actions.useMove(move.id, snatchUser); return null; }, }, @@ -1589,16 +1244,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, flags: { metronome: 1, mustpressure: 1 }, condition: { - // this is a side condition - onSideStart(side) { - this.add('-sidestart', side, 'Spikes'); - this.effectState.layers = 1; - }, - onSideRestart(side) { - if (this.effectState.layers >= 3) return false; - this.add('-sidestart', side, 'Spikes'); - this.effectState.layers++; - }, + inherit: true, + onSwitchIn: undefined, // no inherit onEntryHazard(pokemon) { if (!pokemon.isGrounded() || pokemon.hasItem('heavydutyboots')) return; const damageAmounts = [0, 3, 4, 6]; // 1/8, 1/6, 1/4 @@ -1614,10 +1261,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, flags: { metronome: 1, mustpressure: 1 }, condition: { - // this is a side condition - onSideStart(side) { - this.add('-sidestart', side, 'move: Stealth Rock'); - }, + inherit: true, + onSwitchIn: undefined, // no inherit onEntryHazard(pokemon) { if (pokemon.hasItem('heavydutyboots')) return; const typeMod = this.clampIntRange(pokemon.runEffectiveness(this.dex.getActiveMove('stealthrock')), -6, 6); @@ -1638,12 +1283,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { substitute: { inherit: true, condition: { - onStart(target) { - this.add('-start', target, 'Substitute'); - this.effectState.hp = Math.floor(target.maxhp / 4); - delete target.volatiles['partiallytrapped']; - }, - onTryPrimaryHitPriority: -1, + inherit: true, onTryPrimaryHit(target, source, move) { if (target === source || move.flags['bypasssub']) { return; @@ -1676,9 +1316,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.runEvent('AfterSubDamage', target, source, move, damage); return this.HIT_SUBSTITUTE; }, - onEnd(target) { - this.add('-end', target, 'Substitute'); - }, }, }, suckerpunch: { @@ -1697,13 +1334,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { return !!source.volatiles['stockpile']; }, }, - switcheroo: { - inherit: true, - onTryHit(target, source, move) { - if (target.itemKnockedOff || source.itemKnockedOff) return false; - if (target.hasAbility('multitype') || source.hasAbility('multitype')) return false; - }, - }, synthesis: { inherit: true, onHit(pokemon) { @@ -1730,6 +1360,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { tailwind: { inherit: true, condition: { + inherit: true, duration: 3, durationCallback(target, source, effect) { if (source?.hasAbility('persistent')) { @@ -1738,26 +1369,19 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } return 3; }, - onSideStart(side, source) { - if (source?.hasAbility('persistent')) { - this.add('-sidestart', side, 'move: Tailwind', '[persistent]'); - } else { - this.add('-sidestart', side, 'move: Tailwind'); - } - }, onModifySpe(spe) { return spe * 2; }, onSideResidualOrder: 5, - onSideEnd(side) { - this.add('-sideend', side, 'move: Tailwind'); - }, + onSideResidualSubOrder: undefined, // no inherit }, }, taunt: { inherit: true, flags: { protect: 1, mirror: 1, bypasssub: 1, metronome: 1 }, condition: { + inherit: true, + duration: undefined, // no inherit durationCallback() { return this.random(3, 6); }, @@ -1766,9 +1390,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, onResidualOrder: 10, onResidualSubOrder: 15, - onEnd(target) { - this.add('-end', target, 'move: Taunt'); - }, onDisableMove(pokemon) { for (const moveSlot of pokemon.moveSlots) { if (this.dex.moves.get(moveSlot.id).category === 'Status') { @@ -1802,16 +1423,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, flags: { metronome: 1, mustpressure: 1 }, condition: { - // this is a side condition - onSideStart(side) { - this.add('-sidestart', side, 'move: Toxic Spikes'); - this.effectState.layers = 1; - }, - onSideRestart(side) { - if (this.effectState.layers >= 2) return false; - this.add('-sidestart', side, 'move: Toxic Spikes'); - this.effectState.layers++; - }, + inherit: true, + onSwitchIn: undefined, // no inherit onEntryHazard(pokemon) { if (!pokemon.isGrounded()) return; if (pokemon.hasType('Poison')) { @@ -1831,77 +1444,25 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, flags: { bypasssub: 1, metronome: 1, failencore: 1 }, }, - trick: { - inherit: true, - onTryHit(target, source, move) { - if (target.itemKnockedOff || source.itemKnockedOff) return false; - if (target.hasAbility('multitype') || source.hasAbility('multitype')) return false; - }, - }, trickroom: { inherit: true, condition: { - duration: 5, - durationCallback(source, effect) { - if (source?.hasAbility('persistent')) { - this.add('-activate', source, 'ability: Persistent', '[move] Trick Room'); - return 7; - } - return 5; - }, - onFieldStart(target, source) { - if (source?.hasAbility('persistent')) { - this.add('-fieldstart', 'move: Trick Room', `[of] ${source}`, '[persistent]'); - } else { - this.add('-fieldstart', 'move: Trick Room', `[of] ${source}`); - } - }, - onFieldRestart(target, source) { - this.field.removePseudoWeather('trickroom'); - }, - // Speed modification is changed in Pokemon.getActionSpeed() in sim/pokemon.js + inherit: true, onFieldResidualOrder: 13, - onFieldEnd() { - this.add('-fieldend', 'move: Trick Room'); - }, + onFieldResidualSubOrder: undefined, // no inherit }, }, uproar: { inherit: true, basePower: 50, condition: { - onStart(target) { - this.add('-start', target, 'Uproar'); - // 3-6 turns - this.effectState.duration = this.random(3, 7); - }, - onResidual(target) { - if (target.volatiles['throatchop']) { - target.removeVolatile('uproar'); - return; - } - if (target.lastMove && target.lastMove.id === 'struggle') { - // don't lock - delete target.volatiles['uproar']; - } - this.add('-start', target, 'Uproar', '[upkeep]'); + inherit: true, + duration: undefined, // no inherit + durationCallback() { + return this.random(3, 7); }, onResidualOrder: 10, onResidualSubOrder: 11, - onEnd(target) { - this.add('-end', target, 'Uproar'); - }, - onLockMove: 'uproar', - onAnySetStatus(status, pokemon) { - if (status.id === 'slp') { - if (pokemon === this.effectState.target) { - this.add('-fail', pokemon, 'slp', '[from] Uproar', '[msg]'); - } else { - this.add('-fail', pokemon, 'slp', '[from] Uproar'); - } - return null; - } - }, }, }, volttackle: { @@ -1911,9 +1472,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { watersport: { inherit: true, condition: { - onStart(pokemon) { - this.add('-start', pokemon, 'move: Water Sport'); - }, + inherit: true, + noCopy: false, onAnyBasePowerPriority: 3, onAnyBasePower(basePower, user, target, move) { if (move.type === 'Fire') { @@ -1952,15 +1512,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, recoil: [1, 3], }, - worryseed: { - inherit: true, - onTryHit(pokemon) { - const bannedAbilities = ['multitype', 'truant']; - if (bannedAbilities.includes(pokemon.ability) || pokemon.hasItem('griseousorb')) { - return false; - } - }, - }, wrap: { inherit: true, accuracy: 85, @@ -1976,17 +1527,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { yawn: { inherit: true, condition: { - noCopy: true, // doesn't get copied by Baton Pass - duration: 2, - onStart(target, source) { - this.add('-start', target, 'move: Yawn', `[of] ${source}`); - }, + inherit: true, onResidualOrder: 10, onResidualSubOrder: 19, - onEnd(target) { - this.add('-end', target, 'move: Yawn', '[silent]'); - target.trySetStatus('slp', this.effectState.source); - }, }, }, }; diff --git a/data/mods/gen4/rulesets.ts b/data/mods/gen4/rulesets.ts index bbcb4232d2..71359c6c5a 100644 --- a/data/mods/gen4/rulesets.ts +++ b/data/mods/gen4/rulesets.ts @@ -1,7 +1,16 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { + standardag: { + inherit: true, + ruleset: [ + 'Obtainable', 'HP Percentage Mod', 'Cancel Mod', 'Beat Up Nicknames Mod', 'Endless Battle Clause', + ], + }, standard: { inherit: true, - ruleset: ['Obtainable', 'Sleep Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Items Clause', 'Evasion Moves Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'], + ruleset: [ + 'Standard AG', + 'Sleep Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Items Clause', 'Evasion Moves Clause', + ], }, flatrules: { inherit: true, @@ -21,26 +30,4 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable this.makeRequest('teampreview'); }, }, - validatestats: { - inherit: true, - onValidateSet(set) { - const species = this.dex.species.get(set.species); - const item = this.dex.items.get(set.item); - if (item && item.id === 'griseousorb' && species.num !== 487) { - return ['Griseous Orb can only be held by Giratina in Generation 4.']; - } - if (species.num === 493 && set.evs) { - const isEventArceus = set.moves.includes('roaroftime') || set.moves.includes('shadowforce') || - set.moves.includes('spacialrend'); - if (isEventArceus) { - let stat: StatID; - for (stat in set.evs) { - if (set.evs[stat] > 100) { - return ["Event Arceus may not have more than 100 of any EVs in Generation 4."]; - } - } - } - } - }, - }, }; diff --git a/data/mods/gen4/scripts.ts b/data/mods/gen4/scripts.ts index 67f54d423d..2fc269a6c0 100644 --- a/data/mods/gen4/scripts.ts +++ b/data/mods/gen4/scripts.ts @@ -1,7 +1,18 @@ export const Scripts: ModdedBattleScriptsData = { inherit: 'gen5', gen: 4, - + pokemon: { + inherit: true, + getActionSpeed() { + let speed = this.getStat('spe', false, false); + const trickRoomCheck = this.battle.ruleTable.has('twisteddimensionmod') ? + !this.battle.field.getPseudoWeather('trickroom') : this.battle.field.getPseudoWeather('trickroom'); + if (trickRoomCheck) { + speed = -speed; + } + return speed; + }, + }, actions: { inherit: true, runSwitch(pokemon) { @@ -12,6 +23,16 @@ export const Scripts: ModdedBattleScriptsData = { if (this.battle.gen <= 2) { // pokemon.lastMove is reset for all Pokemon on the field after a switch. This affects Mirror Move. for (const poke of this.battle.getAllActive()) poke.lastMove = null; + if (this.battle.gen === 1) pokemon.side.lastSelectedMoveSlot = 0; + for (const poke of pokemon.foes()) { + if (poke.volatiles['partialtrappinglock'] && poke.moveSlots[poke.side.lastSelectedMoveSlot].id === 'metronome') { + // this is not done for Mirror Move, potentially resulting in a desync + poke.side.lastSelectedMove = 'metronome' as ID; + if (this.battle.queue.willMove(poke)) { + this.battle.queue.changeAction(poke, { choice: 'move', poke, moveid: 'metronome' }); + } + } + } if (!pokemon.side.faintedThisTurn && pokemon.draggedIn !== this.battle.turn) { this.battle.runEvent('AfterSwitchInSelf', pokemon); } @@ -55,10 +76,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/gen4pt/learnsets.ts b/data/mods/gen4pt/learnsets.ts index b28cfa9ad2..26deb90b84 100644 --- a/data/mods/gen4pt/learnsets.ts +++ b/data/mods/gen4pt/learnsets.ts @@ -1475,7 +1475,6 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab hiddenpower: ["4M", "3M"], irontail: ["4M", "4S21", "3M"], knockoff: ["4T"], - lastresort: ["4S18"], lightscreen: ["4M", "4L42", "4S11", "3M", "3L50", "3S0", "3S6", "3S7", "3S8"], magnetrise: ["4T"], megakick: ["3T"], @@ -2916,7 +2915,6 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab steelwing: ["4M", "3M"], substitute: ["4M", "3T"], sunnyday: ["4M", "3M"], - superfang: ["4S0"], supersonic: ["4L1", "3L1"], swagger: ["4M", "3T"], swift: ["4T", "3T"], diff --git a/data/mods/gen5/abilities.ts b/data/mods/gen5/abilities.ts index 32d1a0f1b2..624d6884c0 100644 --- a/data/mods/gen5/abilities.ts +++ b/data/mods/gen5/abilities.ts @@ -31,7 +31,7 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa }, keeneye: { inherit: true, - onModifyMove() {}, + onModifyMove: undefined, // no inherit }, magicbounce: { inherit: true, @@ -68,13 +68,13 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa onImmunity(type, pokemon) { if (type === 'sandstorm' || type === 'hail') return false; }, - onTryHit() {}, + onTryHit: undefined, // no inherit flags: {}, rating: 0.5, }, sapsipper: { inherit: true, - onAllyTryHitSide() {}, + onAllyTryHitSide: undefined, // no inherit }, serenegrace: { inherit: true, @@ -89,7 +89,7 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa }, soundproof: { inherit: true, - onAllyTryHitSide() {}, + onAllyTryHitSide: undefined, // no inherit }, rebound: { inherit: true, diff --git a/data/mods/gen5/moves.ts b/data/mods/gen5/moves.ts index ab4cc6060f..a5c93cd67a 100644 --- a/data/mods/gen5/moves.ts +++ b/data/mods/gen5/moves.ts @@ -36,8 +36,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { autotomize: { inherit: true, volatileStatus: 'autotomize', - onHit(pokemon) { - }, + onHit: undefined, // no inherit condition: { noCopy: true, // doesn't get copied by Baton Pass onStart(pokemon) { @@ -78,6 +77,10 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, flags: { protect: 1, reflectable: 1, mirror: 1, metronome: 1 }, }, + bodyslam: { + inherit: true, + flags: { contact: 1, protect: 1, mirror: 1, nonsky: 1, metronome: 1 }, + }, bounce: { inherit: true, flags: { contact: 1, charge: 1, protect: 1, mirror: 1, gravity: 1, distance: 1, metronome: 1, nosleeptalk: 1 }, @@ -149,7 +152,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, cottonspore: { inherit: true, - onTryHit() {}, + onTryHit: undefined, // no inherit target: "normal", }, covet: { @@ -192,6 +195,10 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, flags: { contact: 1, protect: 1, mirror: 1, punch: 1, metronome: 1 }, }, + dragonrush: { + inherit: true, + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, + }, dreameater: { inherit: true, flags: { protect: 1, mirror: 1, metronome: 1 }, @@ -260,10 +267,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, basePower: 20, condition: { - duration: 2, - onStart() { - this.effectState.multiplier = 1; - }, + inherit: true, onRestart() { if (this.effectState.multiplier < 8) { this.effectState.multiplier <<= 1; @@ -363,6 +367,10 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { return success; }, }, + heatcrash: { + inherit: true, + flags: { contact: 1, protect: 1, mirror: 1, nonsky: 1, metronome: 1 }, + }, heatwave: { inherit: true, basePower: 100, @@ -477,7 +485,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { knockoff: { inherit: true, basePower: 20, - onBasePower() {}, + onBasePower: undefined, // no inherit }, leafstorm: { inherit: true, @@ -494,13 +502,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { lightscreen: { inherit: true, condition: { - duration: 5, - durationCallback(target, source, effect) { - if (source?.hasItem('lightclay')) { - return 8; - } - return 5; - }, + inherit: true, onAnyModifyDamage(damage, source, target, move) { if (target !== source && this.effectState.target.hasAlly(target) && this.getCategory(move) === 'Special') { if (!target.getMoveHitData(move).crit && !move.infiltrates) { @@ -510,14 +512,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } } }, - onSideStart(side) { - this.add('-sidestart', side, 'move: Light Screen'); - }, - onSideResidualOrder: 26, - onSideResidualSubOrder: 2, - onSideEnd(side) { - this.add('-sideend', side, 'move: Light Screen'); - }, }, }, lowsweep: { @@ -527,24 +521,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { magiccoat: { inherit: true, condition: { - duration: 1, - onStart(target, source, effect) { - this.add('-singleturn', target, 'move: Magic Coat'); - if (effect?.effectType === 'Move') { - this.effectState.pranksterBoosted = effect.pranksterBoosted; - } - }, - onTryHitPriority: 2, - onTryHit(target, source, move) { - if (target === source || move.hasBounced || !move.flags['reflectable'] || target.isSemiInvulnerable()) { - return; - } - const newMove = this.dex.getActiveMove(move.id); - newMove.hasBounced = true; - newMove.pranksterBoosted = this.effectState.pranksterBoosted; - this.actions.useMove(newMove, target, { target: source }); - return null; - }, + inherit: true, onAllyTryHitSide(target, source, move) { if (target.isAlly(source) || move.hasBounced || !move.flags['reflectable']) { return; @@ -587,12 +564,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, pp: 20, condition: { - noCopy: true, - onSourceModifyDamage(damage, source, target, move) { - if (['stomp', 'steamroller'].includes(move.id)) { - return this.chainModify(2); - } - }, + inherit: true, + onAccuracy: undefined, // no inherit }, }, moonlight: { @@ -605,7 +578,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, mudsport: { inherit: true, - pseudoWeather: undefined, + pseudoWeather: undefined, // no inherit volatileStatus: 'mudsport', condition: { noCopy: true, @@ -623,7 +596,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, naturepower: { inherit: true, - onTryHit() {}, + onTryHit: undefined, // no inherit onHit(pokemon) { this.actions.useMove('earthquake', pokemon); }, @@ -655,7 +628,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, poisonpowder: { inherit: true, - onTryHit() {}, + onTryHit: undefined, // no inherit }, powergem: { inherit: true, @@ -689,17 +662,14 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { source.addVolatile('stall'); }, condition: { - duration: 1, - onSideStart(target, source) { - this.add('-singleturn', source, 'Quick Guard'); - }, - onTryHitPriority: 4, - onTryHit(target, source, effect) { + inherit: true, + onTryHit(target, source, move) { // Quick Guard only blocks moves with a natural positive priority // (e.g. it doesn't block 0 priority moves boosted by Prankster) - if (effect && (effect.id === 'feint' || this.dex.moves.get(effect.id).priority <= 0)) { + if (move.id === 'feint' || this.dex.moves.get(move.id).priority <= 0) { return; } + if (this.checkMoveBypassesProtect(move, source, target)) return; this.add('-activate', target, 'Quick Guard'); const lockedmove = source.getVolatile('lockedmove'); if (lockedmove) { @@ -716,17 +686,24 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, priority: 3, flags: { noassist: 1, failcopycat: 1 }, + condition: { + inherit: true, + onFoeRedirectTarget(target, source, source2, move) { + const ragePowderUser = this.effectState.target; + if (ragePowderUser.isSkyDropped()) return; + + if (this.validTarget(ragePowderUser, source, move.target)) { + if (move.smartTarget) move.smartTarget = false; + this.debug("Rage Powder redirected target of move"); + return ragePowderUser; + } + }, + }, }, reflect: { inherit: true, condition: { - duration: 5, - durationCallback(target, source, effect) { - if (source?.hasItem('lightclay')) { - return 8; - } - return 5; - }, + inherit: true, onAnyModifyDamage(damage, source, target, move) { if (target !== source && this.effectState.target.hasAlly(target) && this.getCategory(move) === 'Physical') { if (!target.getMoveHitData(move).crit && !move.infiltrates) { @@ -736,14 +713,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } } }, - onSideStart(side) { - this.add('-sidestart', side, 'Reflect'); - }, - onSideResidualOrder: 26, - onSideResidualSubOrder: 1, - onSideEnd(side) { - this.add('-sideend', side, 'Reflect'); - }, }, }, relicsong: { @@ -794,19 +763,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, @@ -838,7 +794,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, sleeppowder: { inherit: true, - onTryHit() {}, + onTryHit: undefined, // no inherit }, smellingsalts: { inherit: true, @@ -871,7 +827,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, spore: { inherit: true, - onTryHit() {}, + onTryHit: undefined, // no inherit }, stormthrow: { inherit: true, @@ -889,17 +845,12 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, stunspore: { inherit: true, - onTryHit() {}, + onTryHit: undefined, // no inherit }, substitute: { inherit: true, condition: { - onStart(target) { - this.add('-start', target, 'Substitute'); - this.effectState.hp = Math.floor(target.maxhp / 4); - delete target.volatiles['partiallytrapped']; - }, - onTryPrimaryHitPriority: -1, + inherit: true, onTryPrimaryHit(target, source, move) { if (target === source || move.flags['bypasssub']) { return; @@ -931,9 +882,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.runEvent('AfterSubDamage', target, source, move, damage); return this.HIT_SUBSTITUTE; }, - onEnd(target) { - this.add('-end', target, 'Substitute'); - }, }, }, submission: { @@ -990,7 +938,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, toxic: { inherit: true, - onPrepareHit() {}, + onPrepareHit: undefined, // no inherit }, uproar: { inherit: true, @@ -1018,7 +966,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, watersport: { inherit: true, - pseudoWeather: undefined, + pseudoWeather: undefined, // no inherit volatileStatus: 'watersport', condition: { noCopy: true, diff --git a/data/mods/gen5/rulesets.ts b/data/mods/gen5/rulesets.ts index 09d83f7635..00e9e52bbf 100644 --- a/data/mods/gen5/rulesets.ts +++ b/data/mods/gen5/rulesets.ts @@ -2,7 +2,8 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable standard: { inherit: true, ruleset: [ - 'Obtainable', 'Team Preview', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Moody Clause', 'Evasion Items Clause', 'Evasion Moves Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod', + 'Standard AG', + 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Items Clause', 'Evasion Moves Clause', ], }, obtainablemoves: { diff --git a/data/mods/gen5pokebilities/abilities.ts b/data/mods/gen5pokebilities/abilities.ts deleted file mode 100644 index a56b598724..0000000000 --- a/data/mods/gen5pokebilities/abilities.ts +++ /dev/null @@ -1,117 +0,0 @@ -export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { - mummy: { - inherit: true, - onDamagingHit(damage, target, source, move) { - if (target.ability === 'mummy') { - const sourceAbility = source.getAbility(); - if (sourceAbility.flags['cantsuppress'] || sourceAbility.id === 'mummy') { - 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}`); - } - } - } else { - const possibleAbilities = [source.ability, ...(source.m.innates || [])] - .filter(val => !this.dex.abilities.get(val).flags['cantsuppress'] && val !== 'mummy'); - if (!possibleAbilities.length) return; - if (this.checkMoveMakesContact(move, source, target, !source.isAlly(target))) { - const abil = this.sample(possibleAbilities); - if (abil === source.ability) { - const oldAbility = source.setAbility('mummy', target); - if (oldAbility) { - this.add('-activate', target, 'ability: Mummy', this.dex.abilities.get(oldAbility).name, `[of] ${source}`); - } - } else { - source.removeVolatile('ability:' + abil); - source.addVolatile('ability:mummy', source); - if (abil) { - this.add('-activate', target, 'ability: Mummy', this.dex.abilities.get(abil).name, `[of] ${source}`); - } - } - } - } - }, - }, - powerofalchemy: { - inherit: true, - onAllyFaint(ally) { - const pokemon = this.effectState.target; - if (!pokemon.hp) return; - const isAbility = pokemon.ability === 'powerofalchemy'; - let possibleAbilities = [ally.ability]; - if (ally.m.innates) possibleAbilities.push(...ally.m.innates); - const additionalBannedAbilities = [pokemon.ability, ...(pokemon.m.innates || [])]; - possibleAbilities = possibleAbilities - .filter(val => !this.dex.abilities.get(val).flags['noreceiver'] && !additionalBannedAbilities.includes(val)); - if (!possibleAbilities.length) return; - const ability = this.dex.abilities.get(possibleAbilities[this.random(possibleAbilities.length)]); - this.add('-ability', pokemon, ability, '[from] ability: Power of Alchemy', `[of] ${ally}`); - if (isAbility) { - pokemon.setAbility(ability); - } else { - pokemon.removeVolatile("ability:powerofalchemy"); - pokemon.addVolatile(`ability:${ability}`, pokemon); - } - }, - }, - receiver: { - inherit: true, - onAllyFaint(ally) { - const pokemon = this.effectState.target; - if (!pokemon.hp) return; - const isAbility = pokemon.ability === 'receiver'; - let possibleAbilities = [ally.ability]; - if (ally.m.innates) possibleAbilities.push(...ally.m.innates); - const additionalBannedAbilities = [pokemon.ability, ...(pokemon.m.innates || [])]; - possibleAbilities = possibleAbilities - .filter(val => !this.dex.abilities.get(val).flags['noreceiver'] && !additionalBannedAbilities.includes(val)); - if (!possibleAbilities.length) return; - const ability = this.dex.abilities.get(possibleAbilities[this.random(possibleAbilities.length)]); - this.add('-ability', pokemon, ability, '[from] ability: Receiver', `[of] ${ally}`); - if (isAbility) { - pokemon.setAbility(ability); - } else { - pokemon.removeVolatile("ability:receiver"); - pokemon.addVolatile(`ability:${ability}`, pokemon); - } - }, - }, - trace: { - inherit: true, - onUpdate(pokemon) { - if (!this.effectState.seek) return; - const isAbility = pokemon.ability === 'trace'; - const possibleTargets: Pokemon[] = []; - for (const target of pokemon.side.foe.active) { - if (target && !target.fainted) { - possibleTargets.push(target); - } - } - while (possibleTargets.length) { - const rand = this.random(possibleTargets.length); - const target = possibleTargets[rand]; - let possibleAbilities = [target.ability]; - if (target.m.innates) possibleAbilities.push(...target.m.innates); - const additionalBannedAbilities = [pokemon.ability, ...(pokemon.m.innates || [])]; - possibleAbilities = possibleAbilities - .filter(val => !this.dex.abilities.get(val).flags['notrace'] && !additionalBannedAbilities.includes(val)); - if (!possibleAbilities.length) { - possibleTargets.splice(rand, 1); - continue; - } - const ability = this.dex.abilities.get(this.sample(possibleAbilities)); - this.add('-ability', pokemon, ability, '[from] ability: Trace', `[of] ${target}`); - if (isAbility) { - pokemon.setAbility(ability); - } else { - pokemon.removeVolatile("ability:trace"); - pokemon.addVolatile(`ability:${ability}`, pokemon); - } - return; - } - }, - }, -}; diff --git a/data/mods/gen5pokebilities/moves.ts b/data/mods/gen5pokebilities/moves.ts deleted file mode 100644 index c473cb8bba..0000000000 --- a/data/mods/gen5pokebilities/moves.ts +++ /dev/null @@ -1,17 +0,0 @@ -export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { - gastroacid: { - inherit: true, - condition: { - // Ability suppression implemented in Pokemon.ignoringAbility() within sim/pokemon.js - onStart(pokemon) { - this.add('-endability', pokemon); - this.singleEvent('End', pokemon.getAbility(), pokemon.abilityState, pokemon, pokemon, 'gastroacid'); - if (pokemon.m.innates) { - for (const innate of pokemon.m.innates) { - pokemon.removeVolatile("ability" + innate); - } - } - }, - }, - }, -}; diff --git a/data/mods/gen5pokebilities/scripts.ts b/data/mods/gen5pokebilities/scripts.ts deleted file mode 100644 index 1cf7fbee15..0000000000 --- a/data/mods/gen5pokebilities/scripts.ts +++ /dev/null @@ -1,215 +0,0 @@ -export const Scripts: ModdedBattleScriptsData = { - inherit: 'gen5', - field: { - suppressingWeather() { - for (const pokemon of this.battle.getAllActive()) { - if (pokemon && !pokemon.fainted && !pokemon.ignoringAbility() && - (pokemon.getAbility().suppressWeather || - pokemon.m.innates?.some((k: string) => this.battle.dex.abilities.get(k).suppressWeather))) { - return true; - } - } - return false; - }, - }, - pokemon: { - ignoringAbility() { - // Check if any active pokemon have the ability Neutralizing Gas - let neutralizinggas = false; - for (const pokemon of this.battle.getAllActive()) { - // can't use hasAbility because it would lead to infinite recursion - if ( - (pokemon.ability === ('neutralizinggas' as ID) || pokemon.m.innates?.some((k: string) => k === 'neutralizinggas')) && - !pokemon.volatiles['gastroacid'] && !pokemon.abilityState.ending - ) { - neutralizinggas = true; - break; - } - } - - return !!( - (this.battle.gen >= 5 && !this.isActive) || - ((this.volatiles['gastroacid'] || - (neutralizinggas && (this.ability !== ('neutralizinggas' as ID) || - this.m.innates?.some((k: string) => k === 'neutralizinggas')) - )) && !this.getAbility().flags['cantsuppress'] - ) - ); - }, - hasAbility(ability) { - if (this.ignoringAbility()) return false; - if (Array.isArray(ability)) return ability.some(abil => this.hasAbility(abil)); - ability = this.battle.toID(ability); - return this.ability === ability || !!this.volatiles['ability:' + ability]; - }, - transformInto(pokemon, effect) { - const species = pokemon.species; - if (pokemon.fainted || this.illusion || pokemon.illusion || (pokemon.volatiles['substitute'] && this.battle.gen >= 5) || - (pokemon.transformed && this.battle.gen >= 2) || (this.transformed && this.battle.gen >= 5) || - species.name === 'Eternatus-Eternamax') { - return false; - } - - if (!this.setSpecies(species, effect, true)) return false; - - this.transformed = true; - this.weighthg = pokemon.weighthg; - - const types = pokemon.getTypes(true, true); - this.setType(pokemon.volatiles['roost'] ? pokemon.volatiles['roost'].typeWas : types, true); - this.addedType = pokemon.addedType; - this.knownType = this.isAlly(pokemon) && pokemon.knownType; - this.apparentType = pokemon.apparentType; - - let statName: StatIDExceptHP; - for (statName in this.storedStats) { - this.storedStats[statName] = pokemon.storedStats[statName]; - if (this.modifiedStats) this.modifiedStats[statName] = pokemon.modifiedStats![statName]; // Gen 1: Copy modified stats. - } - this.moveSlots = []; - this.set.ivs = (this.battle.gen >= 5 ? this.set.ivs : pokemon.set.ivs); - this.hpType = (this.battle.gen >= 5 ? this.hpType : pokemon.hpType); - this.hpPower = (this.battle.gen >= 5 ? this.hpPower : pokemon.hpPower); - this.timesAttacked = pokemon.timesAttacked; - for (const moveSlot of pokemon.moveSlots) { - let moveName = moveSlot.move; - if (moveSlot.id === 'hiddenpower') { - moveName = 'Hidden Power ' + this.hpType; - } - this.moveSlots.push({ - move: moveName, - id: moveSlot.id, - pp: moveSlot.maxpp === 1 ? 1 : 5, - maxpp: this.battle.gen >= 5 ? (moveSlot.maxpp === 1 ? 1 : 5) : moveSlot.maxpp, - target: moveSlot.target, - disabled: false, - used: false, - virtual: true, - }); - } - let boostName: BoostID; - for (boostName in pokemon.boosts) { - this.boosts[boostName] = pokemon.boosts[boostName]; - } - if (this.battle.gen >= 6) { - // we need to be sure to remove all the overlapping crit volatiles before trying to add any of them - const volatilesToCopy = ['dragoncheer', 'focusenergy', 'gmaxchistrike', 'laserfocus']; - for (const volatile of volatilesToCopy) this.removeVolatile(volatile); - for (const volatile of volatilesToCopy) { - if (pokemon.volatiles[volatile]) { - this.addVolatile(volatile); - if (volatile === 'gmaxchistrike') this.volatiles[volatile].layers = pokemon.volatiles[volatile].layers; - if (volatile === 'dragoncheer') this.volatiles[volatile].hasDragonType = pokemon.volatiles[volatile].hasDragonType; - } - } - } - if (effect) { - this.battle.add('-transform', this, pokemon, '[from] ' + effect.fullname); - } else { - this.battle.add('-transform', this, pokemon); - } - if (this.terastallized && this.terastallized !== this.apparentType) { - this.battle.add('-start', this, 'typechange', this.terastallized, '[silent]'); - this.apparentType = this.terastallized; - } - if (this.battle.gen > 2) { - this.setAbility(pokemon.ability, this, null, true); - if (this.m.innates) { - for (const innate of this.m.innates) { - this.removeVolatile('ability:' + innate); - } - } - if (pokemon.m.innates) { - for (const innate of pokemon.m.innates) { - this.addVolatile('ability:' + innate, this); - } - } - } - - // Change formes based on held items (for Transform) - // Only ever relevant in Generation 4 since Generation 3 didn't have item-based forme changes - if (this.battle.gen === 4) { - if (this.species.num === 487) { - // Giratina formes - if (this.species.name === 'Giratina' && this.item === 'griseousorb') { - this.formeChange('Giratina-Origin'); - } else if (this.species.name === 'Giratina-Origin' && this.item !== 'griseousorb') { - this.formeChange('Giratina'); - } - } - if (this.species.num === 493) { - // Arceus formes - const item = this.getItem(); - const targetForme = (item?.onPlate ? 'Arceus-' + item.onPlate : 'Arceus'); - if (this.species.name !== targetForme) { - this.formeChange(targetForme); - } - } - } - - return true; - }, - /** - * Changes this Pokemon's forme to match the given speciesId (or species). - * This function handles all changes to stats, ability, type, species, etc. - * as well as sending all relevant messages sent to the client. - */ - formeChange(speciesId, source, isPermanent, message) { - if (!source) source = this.battle.effect; - - const rawSpecies = this.battle.dex.species.get(speciesId); - - const species = this.setSpecies(rawSpecies, source); - if (!species) return false; - - if (this.battle.gen <= 2) return true; - - // The species the opponent sees - const apparentSpecies = - this.illusion ? this.illusion.species.name : species.baseSpecies; - if (isPermanent) { - this.baseSpecies = rawSpecies; - this.details = this.getUpdatedDetails(); - this.battle.add('detailschange', this, (this.illusion || this).details); - if (source.effectType === 'Item') { - this.canTerastallize = null; // National Dex behavior - if (source.zMove) { - this.battle.add('-burst', this, apparentSpecies, species.requiredItem); - this.moveThisTurnResult = true; // Ultra Burst counts as an action for Truant - } else if (source.isPrimalOrb) { - if (this.illusion) { - this.ability = ''; - this.battle.add('-primal', this.illusion); - } else { - this.battle.add('-primal', this); - } - } else { - this.battle.add('-mega', this, apparentSpecies, species.requiredItem); - this.moveThisTurnResult = true; // Mega Evolution counts as an action for Truant - } - } else if (source.effectType === 'Status') { - // Shaymin-Sky -> Shaymin - this.battle.add('-formechange', this, species.name, message); - } - } else { - if (source.effectType === 'Ability') { - this.battle.add('-formechange', this, species.name, message, `[from] ability: ${source.name}`); - } else { - this.battle.add('-formechange', this, this.illusion ? this.illusion.species.name : species.name, message); - } - } - if (isPermanent && !['disguise', 'iceface', 'ability:disguise', 'ability:iceface'].includes(source.id)) { - if (this.illusion) { - this.ability = ''; // Don't allow Illusion to wear off - } - this.setAbility(species.abilities['0'], null, null, true); - this.baseAbility = this.ability; - } - if (this.terastallized && this.terastallized !== this.apparentType) { - this.battle.add('-start', this, 'typechange', this.terastallized, '[silent]'); - this.apparentType = this.terastallized; - } - return true; - }, - }, -}; diff --git a/data/mods/gen6/abilities.ts b/data/mods/gen6/abilities.ts index 1da8541209..eb65bae007 100644 --- a/data/mods/gen6/abilities.ts +++ b/data/mods/gen6/abilities.ts @@ -54,7 +54,7 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa move.type = 'Normal'; } }, - onBasePower() {}, + onBasePower: undefined, // no inherit rating: -1, }, parentalbond: { @@ -93,7 +93,7 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa const targetForme = (move.id === 'kingsshield' ? 'Aegislash' : 'Aegislash-Blade'); if (attacker.species.name !== targetForme) attacker.formeChange(targetForme); }, - onModifyMove() {}, + onModifyMove: undefined, // no inherit }, symbiosis: { inherit: true, diff --git a/data/mods/gen6/conditions.ts b/data/mods/gen6/conditions.ts index fedfe5dafa..ee569eb1a0 100644 --- a/data/mods/gen6/conditions.ts +++ b/data/mods/gen6/conditions.ts @@ -40,6 +40,6 @@ export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDa }, choicelock: { inherit: true, - onBeforeMove() {}, + onBeforeMove: undefined, // no inherit }, }; 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/gen6/items.ts b/data/mods/gen6/items.ts index ebf483dd32..2fbaa0900d 100644 --- a/data/mods/gen6/items.ts +++ b/data/mods/gen6/items.ts @@ -165,7 +165,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { }, souldew: { inherit: true, - onBasePower() {}, + onBasePower: undefined, // no inherit onModifySpAPriority: 1, onModifySpA(spa, pokemon) { if (pokemon.baseSpecies.num === 380 || pokemon.baseSpecies.num === 381) { diff --git a/data/mods/gen6/moves.ts b/data/mods/gen6/moves.ts index 07852e3445..7b77cff9b8 100644 --- a/data/mods/gen6/moves.ts +++ b/data/mods/gen6/moves.ts @@ -14,7 +14,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { darkvoid: { inherit: true, accuracy: 80, - onTry() {}, + onTry: undefined, // no inherit }, destinybond: { inherit: true, @@ -24,7 +24,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, diamondstorm: { inherit: true, - self: null, + self: undefined, // no inherit secondary: { chance: 50, self: { @@ -34,48 +34,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, }, }, - encore: { - inherit: true, - condition: { - duration: 3, - onStart(target) { - const moveSlot = target.lastMove ? target.getMoveData(target.lastMove.id) : null; - if (!target.lastMove || target.lastMove.flags['failencore'] || !moveSlot || moveSlot.pp <= 0) { - // it failed - return false; - } - this.effectState.move = target.lastMove.id; - this.add('-start', target, 'Encore'); - if (!this.queue.willMove(target)) { - this.effectState.duration!++; - } - }, - onOverrideAction(pokemon, target, move) { - if (move.id !== this.effectState.move) return this.effectState.move; - }, - onResidualOrder: 16, - onResidual(target) { - const lockedMoveSlot = target.getMoveData(this.effectState.move); - if (lockedMoveSlot && lockedMoveSlot.pp <= 0) { - // Encore ends early if you run out of PP - target.removeVolatile('encore'); - } - }, - onEnd(target) { - this.add('-end', target, 'Encore'); - }, - onDisableMove(pokemon) { - if (!this.effectState.move || !pokemon.hasMove(this.effectState.move)) { - return; - } - for (const moveSlot of pokemon.moveSlots) { - if (moveSlot.id !== this.effectState.move) { - pokemon.disableMove(moveSlot.id); - } - } - }, - }, - }, fellstinger: { inherit: true, basePower: 30, @@ -87,6 +45,10 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, basePower: 80, }, + heavyslam: { + inherit: true, + flags: { contact: 1, protect: 1, mirror: 1, nonsky: 1, metronome: 1 }, + }, leechlife: { inherit: true, basePower: 20, @@ -96,29 +58,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, flags: { protect: 1, bypasssub: 1, noassist: 1, failcopycat: 1, failmefirst: 1, nosleeptalk: 1 }, }, - minimize: { - inherit: true, - condition: { - noCopy: true, - onSourceModifyDamage(damage, source, target, move) { - const boostedMoves = [ - 'stomp', 'steamroller', 'bodyslam', 'flyingpress', 'dragonrush', 'phantomforce', 'heatcrash', 'shadowforce', - ]; - if (boostedMoves.includes(move.id)) { - return this.chainModify(2); - } - }, - onAccuracy(accuracy, target, source, move) { - const boostedMoves = [ - 'stomp', 'steamroller', 'bodyslam', 'flyingpress', 'dragonrush', 'phantomforce', 'heatcrash', 'shadowforce', - ]; - if (boostedMoves.includes(move.id)) { - return true; - } - return accuracy; - }, - }, - }, metronome: { inherit: true, flags: { noassist: 1, failcopycat: 1, nosleeptalk: 1 }, @@ -126,39 +65,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { mistyterrain: { inherit: true, condition: { - effectType: 'Terrain', - duration: 5, - durationCallback(source, effect) { - if (source?.hasItem('terrainextender')) { - return 8; - } - return 5; - }, - onSetStatus(status, target, source, effect) { - if (!target.isGrounded() || target.isSemiInvulnerable()) return; - if (effect && ((effect as Move).status || effect.id === 'yawn')) { - this.add('-activate', target, 'move: Misty Terrain'); - } - return false; - }, - onBasePower(basePower, attacker, defender, move) { - if (move.type === 'Dragon' && defender.isGrounded() && !defender.isSemiInvulnerable()) { - this.debug('misty terrain weaken'); - return this.chainModify(0.5); - } - }, - onFieldStart(field, source, effect) { - if (effect?.effectType === 'Ability') { - this.add('-fieldstart', 'move: Misty Terrain', `[from] ability: ${effect}`, `[of] ${source}`); - } else { - this.add('-fieldstart', 'move: Misty Terrain'); - } - }, - onFieldResidualOrder: 27, - onFieldResidualSubOrder: 7, - onFieldEnd() { - this.add('-fieldend', 'Misty Terrain'); - }, + inherit: true, + onTryAddVolatile: undefined, // no inherit }, }, mysticalfire: { @@ -179,28 +87,25 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.boost({ atk: -1, spa: -1 }, target, source); }, }, + phantomforce: { + inherit: true, + flags: { contact: 1, charge: 1, mirror: 1, metronome: 1, nosleeptalk: 1, noassist: 1, failinstruct: 1, minimize: 1 }, + }, powder: { inherit: true, condition: { - duration: 1, - onStart(target) { - this.add('-singleturn', target, 'Powder'); - }, + inherit: true, onTryMovePriority: 1, - onTryMove(pokemon, target, move) { - if (move.type === 'Fire') { - this.add('-activate', pokemon, 'move: Powder'); - this.damage(this.clampIntRange(Math.round(pokemon.maxhp / 4), 1)); - this.attrLastMove('[still]'); - return false; - } - }, }, }, rockblast: { inherit: true, flags: { protect: 1, mirror: 1, metronome: 1 }, }, + shadowforce: { + inherit: true, + flags: { contact: 1, charge: 1, mirror: 1, metronome: 1, nosleeptalk: 1, noassist: 1, failinstruct: 1, minimize: 1 }, + }, sheercold: { inherit: true, ohko: true, @@ -263,19 +168,13 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { wideguard: { inherit: true, condition: { - duration: 1, - onSideStart(target, source) { - this.add('-singleturn', source, 'Wide Guard'); - }, - onTryHitPriority: 4, - onTryHit(target, source, effect) { + inherit: true, + onTryHit(target, source, move) { // Wide Guard blocks damaging spread moves - if ( - effect && - (effect.category === 'Status' || (effect.target !== 'allAdjacent' && effect.target !== 'allAdjacentFoes')) - ) { + if (move.category === 'Status' || (move?.target !== 'allAdjacent' && move.target !== 'allAdjacentFoes')) { return; } + if (this.checkMoveBypassesProtect(move, source, target, false)) return; this.add('-activate', target, 'move: Wide Guard'); const lockedmove = source.getVolatile('lockedmove'); if (lockedmove) { diff --git a/data/mods/gen7/abilities.ts b/data/mods/gen7/abilities.ts index 83905da67e..e530405104 100644 --- a/data/mods/gen7/abilities.ts +++ b/data/mods/gen7/abilities.ts @@ -34,7 +34,7 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa innerfocus: { inherit: true, rating: 1, - onTryBoost() {}, + onTryBoost: undefined, // no inherit }, moody: { inherit: true, @@ -65,25 +65,19 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa }, oblivious: { inherit: true, - onTryBoost() {}, + onTryBoost: undefined, // no inherit }, owntempo: { inherit: true, - onTryBoost() {}, + onTryBoost: undefined, // no inherit }, rattled: { - onDamagingHit(damage, target, source, move) { - if (['Dark', 'Bug', 'Ghost'].includes(move.type)) { - this.boost({ spe: 1 }); - } - }, - name: "Rattled", - rating: 1.5, - num: 155, + inherit: true, + onAfterBoost: undefined, // no inherit }, scrappy: { inherit: true, - onTryBoost() {}, + onTryBoost: undefined, // no inherit }, slowstart: { inherit: true, 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/gen7/moves.ts b/data/mods/gen7/moves.ts index 62c55d6c4a..5a9fa8c69e 100644 --- a/data/mods/gen7/moves.ts +++ b/data/mods/gen7/moves.ts @@ -182,47 +182,13 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { electricterrain: { inherit: true, condition: { - effectType: 'Terrain', - duration: 5, - durationCallback(source, effect) { - if (source?.hasItem('terrainextender')) { - return 8; - } - return 5; - }, - onSetStatus(status, target, source, effect) { - if (status.id === 'slp' && target.isGrounded() && !target.isSemiInvulnerable()) { - if (effect.id === 'yawn' || (effect.effectType === 'Move' && !effect.secondaries)) { - this.add('-activate', target, 'move: Electric Terrain'); - } - return false; - } - }, - onTryAddVolatile(status, target) { - if (!target.isGrounded() || target.isSemiInvulnerable()) return; - if (status.id === 'yawn') { - this.add('-activate', target, 'move: Electric Terrain'); - return null; - } - }, + inherit: true, onBasePower(basePower, attacker, defender, move) { if (move.type === 'Electric' && attacker.isGrounded() && !attacker.isSemiInvulnerable()) { this.debug('electric terrain boost'); return this.chainModify(1.5); } }, - onFieldStart(field, source, effect) { - if (effect && effect.effectType === 'Ability') { - this.add('-fieldstart', 'move: Electric Terrain', `[from] ability: ${effect}`, `[of] ${source}`); - } else { - this.add('-fieldstart', 'move: Electric Terrain'); - } - }, - onFieldResidualOrder: 27, - onFieldResidualSubOrder: 7, - onFieldEnd() { - this.add('-fieldend', 'move: Electric Terrain'); - }, }, }, embargo: { @@ -307,7 +273,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, grassknot: { inherit: true, - onTryHit() {}, + onTryHit: undefined, // no inherit }, grasswhistle: { inherit: true, @@ -316,14 +282,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { grassyterrain: { inherit: true, condition: { - effectType: 'Terrain', - duration: 5, - durationCallback(source, effect) { - if (source?.hasItem('terrainextender')) { - return 8; - } - return 5; - }, + inherit: true, onBasePower(basePower, attacker, defender, move) { const weakenedMoves = ['earthquake', 'bulldoze', 'magnitude']; if (weakenedMoves.includes(move.id) && defender.isGrounded() && !defender.isSemiInvulnerable()) { @@ -335,27 +294,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { return this.chainModify(1.5); } }, - onFieldStart(field, source, effect) { - if (effect && effect.effectType === 'Ability') { - this.add('-fieldstart', 'move: Grassy Terrain', `[from] ability: ${effect}`, `[of] ${source}`); - } else { - this.add('-fieldstart', 'move: Grassy Terrain'); - } - }, - onResidualOrder: 5, - onResidualSubOrder: 2, - onResidual(pokemon) { - if (pokemon.isGrounded() && !pokemon.isSemiInvulnerable()) { - this.heal(pokemon.baseMaxhp / 16, pokemon, pokemon); - } else { - this.debug(`Pokemon semi-invuln or not grounded; Grassy Terrain skipped`); - } - }, - onFieldResidualOrder: 27, - onFieldResidualSubOrder: 7, - onFieldEnd() { - this.add('-fieldend', 'move: Grassy Terrain'); - }, }, }, guardianofalola: { @@ -429,11 +367,11 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, heatcrash: { inherit: true, - onTryHit() {}, + onTryHit: undefined, // no inherit }, heavyslam: { inherit: true, - onTryHit() {}, + onTryHit: undefined, // no inherit }, hiddenpower: { inherit: true, @@ -558,16 +496,9 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { kingsshield: { inherit: true, condition: { - duration: 1, - onStart(target) { - this.add('-singleturn', target, 'Protect'); - }, - onTryHitPriority: 3, + inherit: true, onTryHit(target, source, move) { - if (!move.flags['protect'] || move.category === 'Status') { - if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true; - return; - } + if (this.checkMoveBypassesProtect(move, source, target, false)) return; this.add('-activate', target, 'move: Protect'); const lockedmove = source.getVolatile('lockedmove'); if (lockedmove) { @@ -602,7 +533,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, lowkick: { inherit: true, - onTryHit() {}, + onTryHit: undefined, // no inherit }, luckychant: { inherit: true, @@ -780,48 +711,13 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { psychicterrain: { inherit: true, condition: { - effectType: 'Terrain', - duration: 5, - durationCallback(source, effect) { - if (source?.hasItem('terrainextender')) { - return 8; - } - return 5; - }, - onTryHitPriority: 4, - onTryHit(target, source, effect) { - if (effect && (effect.priority <= 0.1 || effect.target === 'self')) { - return; - } - if (target.isSemiInvulnerable() || target.isAlly(source)) return; - if (!target.isGrounded()) { - const baseMove = this.dex.moves.get(effect.id); - if (baseMove.priority > 0) { - this.hint("Psychic Terrain doesn't affect Pokémon immune to Ground."); - } - return; - } - this.add('-activate', target, 'move: Psychic Terrain'); - return null; - }, + inherit: true, onBasePower(basePower, attacker, defender, move) { if (move.type === 'Psychic' && attacker.isGrounded() && !attacker.isSemiInvulnerable()) { this.debug('psychic terrain boost'); return this.chainModify(1.5); } }, - onFieldStart(field, source, effect) { - if (effect && effect.effectType === 'Ability') { - this.add('-fieldstart', 'move: Psychic Terrain', `[from] ability: ${effect}`, `[of] ${source}`); - } else { - this.add('-fieldstart', 'move: Psychic Terrain'); - } - }, - onFieldResidualOrder: 27, - onFieldResidualSubOrder: 7, - onFieldEnd() { - this.add('-fieldend', 'move: Psychic Terrain'); - }, }, }, psychoboost: { @@ -876,7 +772,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { rapidspin: { inherit: true, basePower: 20, - secondary: null, + secondary: undefined, // no inherit }, razorwind: { inherit: true, @@ -1182,6 +1078,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { basePower: 50, pp: 15, willCrit: true, - secondary: null, + secondary: undefined, // no inherit }, }; diff --git a/data/mods/gen7/rulesets.ts b/data/mods/gen7/rulesets.ts index 7114fc638b..3416d4e202 100644 --- a/data/mods/gen7/rulesets.ts +++ b/data/mods/gen7/rulesets.ts @@ -1,11 +1,19 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { standard: { inherit: true, - ruleset: ['Obtainable', 'Team Preview', 'Sleep Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Moody Clause', 'Evasion Items Clause', 'Evasion Moves Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'], + ruleset: [ + 'Standard AG', + 'Sleep Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Items Clause', 'Evasion Moves Clause', + ], + banlist: ['Moody'], }, standarddoubles: { inherit: true, - ruleset: ['Obtainable', 'Team Preview', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Moody Clause', 'Evasion Abilities Clause', 'Evasion Moves Clause', 'Gravity Sleep Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod'], + ruleset: [ + 'Standard AG', + 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Abilities Clause', 'Evasion Moves Clause', 'Gravity Sleep Clause', + ], + banlist: ['Moody'], }, obtainablemoves: { inherit: true, diff --git a/data/mods/gen7letsgo/moves.ts b/data/mods/gen7letsgo/moves.ts index 552a0df8c8..f44ed9d801 100644 --- a/data/mods/gen7letsgo/moves.ts +++ b/data/mods/gen7letsgo/moves.ts @@ -19,6 +19,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { doubleironbash: { inherit: true, isNonstandard: null, + flags: { contact: 1, protect: 1, mirror: 1, punch: 1, minimize: 1 }, }, floatyfall: { inherit: true, @@ -41,8 +42,11 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { inherit: true, desc: "A random move that was introduced in gen 1 is selected for use, other than Counter, Mimic, Mirror Move, Struggle, or Transform.", shortDesc: "Picks a random move from gen 1.", - onHit(target, source, effect) { - const moves = this.dex.moves.all().filter(move => move.gen === 1 && move.flags['metronome']); + onHit(target) { + const moves = this.dex.moves.all().filter(move => ( + (!move.isNonstandard || move.isNonstandard === 'Unobtainable') && + move.flags['metronome'] && move.gen === 1 + )); let randomMove = ''; if (moves.length) { moves.sort((a, b) => a.num - b.num); diff --git a/data/mods/gen7letsgo/rulesets.ts b/data/mods/gen7letsgo/rulesets.ts index 477ad861e6..d01a6d2f48 100644 --- a/data/mods/gen7letsgo/rulesets.ts +++ b/data/mods/gen7letsgo/rulesets.ts @@ -1,10 +1,16 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = { standard: { inherit: true, - ruleset: ['LGPE Normal Rules', 'Obtainable', 'Team Preview', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod'], + ruleset: [ + 'Standard AG', + 'LGPE Normal Rules', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Sleep Clause Mod', + ], }, standarddoubles: { inherit: true, - ruleset: ['LGPE Normal Rules', 'Obtainable', 'Team Preview', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'HP Percentage Mod', 'Cancel Mod'], + ruleset: [ + 'Standard AG', + 'LGPE Normal Rules', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', + ], }, }; diff --git a/data/mods/gen7pokebilities/abilities.ts b/data/mods/gen7pokebilities/abilities.ts deleted file mode 100644 index a56b598724..0000000000 --- a/data/mods/gen7pokebilities/abilities.ts +++ /dev/null @@ -1,117 +0,0 @@ -export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { - mummy: { - inherit: true, - onDamagingHit(damage, target, source, move) { - if (target.ability === 'mummy') { - const sourceAbility = source.getAbility(); - if (sourceAbility.flags['cantsuppress'] || sourceAbility.id === 'mummy') { - 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}`); - } - } - } else { - const possibleAbilities = [source.ability, ...(source.m.innates || [])] - .filter(val => !this.dex.abilities.get(val).flags['cantsuppress'] && val !== 'mummy'); - if (!possibleAbilities.length) return; - if (this.checkMoveMakesContact(move, source, target, !source.isAlly(target))) { - const abil = this.sample(possibleAbilities); - if (abil === source.ability) { - const oldAbility = source.setAbility('mummy', target); - if (oldAbility) { - this.add('-activate', target, 'ability: Mummy', this.dex.abilities.get(oldAbility).name, `[of] ${source}`); - } - } else { - source.removeVolatile('ability:' + abil); - source.addVolatile('ability:mummy', source); - if (abil) { - this.add('-activate', target, 'ability: Mummy', this.dex.abilities.get(abil).name, `[of] ${source}`); - } - } - } - } - }, - }, - powerofalchemy: { - inherit: true, - onAllyFaint(ally) { - const pokemon = this.effectState.target; - if (!pokemon.hp) return; - const isAbility = pokemon.ability === 'powerofalchemy'; - let possibleAbilities = [ally.ability]; - if (ally.m.innates) possibleAbilities.push(...ally.m.innates); - const additionalBannedAbilities = [pokemon.ability, ...(pokemon.m.innates || [])]; - possibleAbilities = possibleAbilities - .filter(val => !this.dex.abilities.get(val).flags['noreceiver'] && !additionalBannedAbilities.includes(val)); - if (!possibleAbilities.length) return; - const ability = this.dex.abilities.get(possibleAbilities[this.random(possibleAbilities.length)]); - this.add('-ability', pokemon, ability, '[from] ability: Power of Alchemy', `[of] ${ally}`); - if (isAbility) { - pokemon.setAbility(ability); - } else { - pokemon.removeVolatile("ability:powerofalchemy"); - pokemon.addVolatile(`ability:${ability}`, pokemon); - } - }, - }, - receiver: { - inherit: true, - onAllyFaint(ally) { - const pokemon = this.effectState.target; - if (!pokemon.hp) return; - const isAbility = pokemon.ability === 'receiver'; - let possibleAbilities = [ally.ability]; - if (ally.m.innates) possibleAbilities.push(...ally.m.innates); - const additionalBannedAbilities = [pokemon.ability, ...(pokemon.m.innates || [])]; - possibleAbilities = possibleAbilities - .filter(val => !this.dex.abilities.get(val).flags['noreceiver'] && !additionalBannedAbilities.includes(val)); - if (!possibleAbilities.length) return; - const ability = this.dex.abilities.get(possibleAbilities[this.random(possibleAbilities.length)]); - this.add('-ability', pokemon, ability, '[from] ability: Receiver', `[of] ${ally}`); - if (isAbility) { - pokemon.setAbility(ability); - } else { - pokemon.removeVolatile("ability:receiver"); - pokemon.addVolatile(`ability:${ability}`, pokemon); - } - }, - }, - trace: { - inherit: true, - onUpdate(pokemon) { - if (!this.effectState.seek) return; - const isAbility = pokemon.ability === 'trace'; - const possibleTargets: Pokemon[] = []; - for (const target of pokemon.side.foe.active) { - if (target && !target.fainted) { - possibleTargets.push(target); - } - } - while (possibleTargets.length) { - const rand = this.random(possibleTargets.length); - const target = possibleTargets[rand]; - let possibleAbilities = [target.ability]; - if (target.m.innates) possibleAbilities.push(...target.m.innates); - const additionalBannedAbilities = [pokemon.ability, ...(pokemon.m.innates || [])]; - possibleAbilities = possibleAbilities - .filter(val => !this.dex.abilities.get(val).flags['notrace'] && !additionalBannedAbilities.includes(val)); - if (!possibleAbilities.length) { - possibleTargets.splice(rand, 1); - continue; - } - const ability = this.dex.abilities.get(this.sample(possibleAbilities)); - this.add('-ability', pokemon, ability, '[from] ability: Trace', `[of] ${target}`); - if (isAbility) { - pokemon.setAbility(ability); - } else { - pokemon.removeVolatile("ability:trace"); - pokemon.addVolatile(`ability:${ability}`, pokemon); - } - return; - } - }, - }, -}; diff --git a/data/mods/gen7pokebilities/moves.ts b/data/mods/gen7pokebilities/moves.ts deleted file mode 100644 index c473cb8bba..0000000000 --- a/data/mods/gen7pokebilities/moves.ts +++ /dev/null @@ -1,17 +0,0 @@ -export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { - gastroacid: { - inherit: true, - condition: { - // Ability suppression implemented in Pokemon.ignoringAbility() within sim/pokemon.js - onStart(pokemon) { - this.add('-endability', pokemon); - this.singleEvent('End', pokemon.getAbility(), pokemon.abilityState, pokemon, pokemon, 'gastroacid'); - if (pokemon.m.innates) { - for (const innate of pokemon.m.innates) { - pokemon.removeVolatile("ability" + innate); - } - } - }, - }, - }, -}; diff --git a/data/mods/gen7pokebilities/scripts.ts b/data/mods/gen7pokebilities/scripts.ts deleted file mode 100644 index 22e71225a7..0000000000 --- a/data/mods/gen7pokebilities/scripts.ts +++ /dev/null @@ -1,215 +0,0 @@ -export const Scripts: ModdedBattleScriptsData = { - inherit: 'gen7', - field: { - suppressingWeather() { - for (const pokemon of this.battle.getAllActive()) { - if (pokemon && !pokemon.fainted && !pokemon.ignoringAbility() && - (pokemon.getAbility().suppressWeather || - pokemon.m.innates?.some((k: string) => this.battle.dex.abilities.get(k).suppressWeather))) { - return true; - } - } - return false; - }, - }, - pokemon: { - ignoringAbility() { - // Check if any active pokemon have the ability Neutralizing Gas - let neutralizinggas = false; - for (const pokemon of this.battle.getAllActive()) { - // can't use hasAbility because it would lead to infinite recursion - if ( - (pokemon.ability === ('neutralizinggas' as ID) || pokemon.m.innates?.some((k: string) => k === 'neutralizinggas')) && - !pokemon.volatiles['gastroacid'] && !pokemon.abilityState.ending - ) { - neutralizinggas = true; - break; - } - } - - return !!( - (this.battle.gen >= 5 && !this.isActive) || - ((this.volatiles['gastroacid'] || - (neutralizinggas && (this.ability !== ('neutralizinggas' as ID) || - this.m.innates?.some((k: string) => k === 'neutralizinggas')) - )) && !this.getAbility().flags['cantsuppress'] - ) - ); - }, - hasAbility(ability) { - if (this.ignoringAbility()) return false; - if (Array.isArray(ability)) return ability.some(abil => this.hasAbility(abil)); - ability = this.battle.toID(ability); - return this.ability === ability || !!this.volatiles['ability:' + ability]; - }, - transformInto(pokemon, effect) { - const species = pokemon.species; - if (pokemon.fainted || this.illusion || pokemon.illusion || (pokemon.volatiles['substitute'] && this.battle.gen >= 5) || - (pokemon.transformed && this.battle.gen >= 2) || (this.transformed && this.battle.gen >= 5) || - species.name === 'Eternatus-Eternamax') { - return false; - } - - if (!this.setSpecies(species, effect, true)) return false; - - this.transformed = true; - this.weighthg = pokemon.weighthg; - - const types = pokemon.getTypes(true, true); - this.setType(pokemon.volatiles['roost'] ? pokemon.volatiles['roost'].typeWas : types, true); - this.addedType = pokemon.addedType; - this.knownType = this.isAlly(pokemon) && pokemon.knownType; - this.apparentType = pokemon.apparentType; - - let statName: StatIDExceptHP; - for (statName in this.storedStats) { - this.storedStats[statName] = pokemon.storedStats[statName]; - if (this.modifiedStats) this.modifiedStats[statName] = pokemon.modifiedStats![statName]; // Gen 1: Copy modified stats. - } - this.moveSlots = []; - this.set.ivs = (this.battle.gen >= 5 ? this.set.ivs : pokemon.set.ivs); - this.hpType = (this.battle.gen >= 5 ? this.hpType : pokemon.hpType); - this.hpPower = (this.battle.gen >= 5 ? this.hpPower : pokemon.hpPower); - this.timesAttacked = pokemon.timesAttacked; - for (const moveSlot of pokemon.moveSlots) { - let moveName = moveSlot.move; - if (moveSlot.id === 'hiddenpower') { - moveName = 'Hidden Power ' + this.hpType; - } - this.moveSlots.push({ - move: moveName, - id: moveSlot.id, - pp: moveSlot.maxpp === 1 ? 1 : 5, - maxpp: this.battle.gen >= 5 ? (moveSlot.maxpp === 1 ? 1 : 5) : moveSlot.maxpp, - target: moveSlot.target, - disabled: false, - used: false, - virtual: true, - }); - } - let boostName: BoostID; - for (boostName in pokemon.boosts) { - this.boosts[boostName] = pokemon.boosts[boostName]; - } - if (this.battle.gen >= 6) { - // we need to be sure to remove all the overlapping crit volatiles before trying to add any of them - const volatilesToCopy = ['dragoncheer', 'focusenergy', 'gmaxchistrike', 'laserfocus']; - for (const volatile of volatilesToCopy) this.removeVolatile(volatile); - for (const volatile of volatilesToCopy) { - if (pokemon.volatiles[volatile]) { - this.addVolatile(volatile); - if (volatile === 'gmaxchistrike') this.volatiles[volatile].layers = pokemon.volatiles[volatile].layers; - if (volatile === 'dragoncheer') this.volatiles[volatile].hasDragonType = pokemon.volatiles[volatile].hasDragonType; - } - } - } - if (effect) { - this.battle.add('-transform', this, pokemon, '[from] ' + effect.fullname); - } else { - this.battle.add('-transform', this, pokemon); - } - if (this.terastallized && this.terastallized !== this.apparentType) { - this.battle.add('-start', this, 'typechange', this.terastallized, '[silent]'); - this.apparentType = this.terastallized; - } - if (this.battle.gen > 2) { - this.setAbility(pokemon.ability, this, null, true); - if (this.m.innates) { - for (const innate of this.m.innates) { - this.removeVolatile('ability:' + innate); - } - } - if (pokemon.m.innates) { - for (const innate of pokemon.m.innates) { - this.addVolatile('ability:' + innate, this); - } - } - } - - // Change formes based on held items (for Transform) - // Only ever relevant in Generation 4 since Generation 3 didn't have item-based forme changes - if (this.battle.gen === 4) { - if (this.species.num === 487) { - // Giratina formes - if (this.species.name === 'Giratina' && this.item === 'griseousorb') { - this.formeChange('Giratina-Origin'); - } else if (this.species.name === 'Giratina-Origin' && this.item !== 'griseousorb') { - this.formeChange('Giratina'); - } - } - if (this.species.num === 493) { - // Arceus formes - const item = this.getItem(); - const targetForme = (item?.onPlate ? 'Arceus-' + item.onPlate : 'Arceus'); - if (this.species.name !== targetForme) { - this.formeChange(targetForme); - } - } - } - - return true; - }, - /** - * Changes this Pokemon's forme to match the given speciesId (or species). - * This function handles all changes to stats, ability, type, species, etc. - * as well as sending all relevant messages sent to the client. - */ - formeChange(speciesId, source, isPermanent, message) { - if (!source) source = this.battle.effect; - - const rawSpecies = this.battle.dex.species.get(speciesId); - - const species = this.setSpecies(rawSpecies, source); - if (!species) return false; - - if (this.battle.gen <= 2) return true; - - // The species the opponent sees - const apparentSpecies = - this.illusion ? this.illusion.species.name : species.baseSpecies; - if (isPermanent) { - this.baseSpecies = rawSpecies; - this.details = this.getUpdatedDetails(); - this.battle.add('detailschange', this, (this.illusion || this).details); - if (source.effectType === 'Item') { - this.canTerastallize = null; // National Dex behavior - if (source.zMove) { - this.battle.add('-burst', this, apparentSpecies, species.requiredItem); - this.moveThisTurnResult = true; // Ultra Burst counts as an action for Truant - } else if (source.isPrimalOrb) { - if (this.illusion) { - this.ability = ''; - this.battle.add('-primal', this.illusion); - } else { - this.battle.add('-primal', this); - } - } else { - this.battle.add('-mega', this, apparentSpecies, species.requiredItem); - this.moveThisTurnResult = true; // Mega Evolution counts as an action for Truant - } - } else if (source.effectType === 'Status') { - // Shaymin-Sky -> Shaymin - this.battle.add('-formechange', this, species.name, message); - } - } else { - if (source.effectType === 'Ability') { - this.battle.add('-formechange', this, species.name, message, `[from] ability: ${source.name}`); - } else { - this.battle.add('-formechange', this, this.illusion ? this.illusion.species.name : species.name, message); - } - } - if (isPermanent && !['disguise', 'iceface', 'ability:disguise', 'ability:iceface'].includes(source.id)) { - if (this.illusion) { - this.ability = ''; // Don't allow Illusion to wear off - } - this.setAbility(species.abilities['0'], null, null, true); - this.baseAbility = this.ability; - } - if (this.terastallized && this.terastallized !== this.apparentType) { - this.battle.add('-start', this, 'typechange', this.terastallized, '[silent]'); - this.apparentType = this.terastallized; - } - return true; - }, - }, -}; diff --git a/data/mods/gen8/abilities.ts b/data/mods/gen8/abilities.ts index 7bb273db16..8ab23d8636 100644 --- a/data/mods/gen8/abilities.ts +++ b/data/mods/gen8/abilities.ts @@ -428,8 +428,8 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa }, heatproof: { inherit: true, - onSourceModifyAtk() {}, - onSourceModifySpA() {}, + onSourceModifyAtk: undefined, // no inherit + onSourceModifySpA: undefined, // no inherit onSourceBasePowerPriority: 18, onSourceBasePower(basePower, attacker, defender, move) { if (move.type === 'Fire') { @@ -481,8 +481,8 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa }, illuminate: { inherit: true, - onTryBoost() {}, - onModifyMove() {}, + onTryBoost: undefined, // no inherit + onModifyMove: undefined, // no inherit flags: {}, rating: 0, }, 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/moves.ts b/data/mods/gen8/moves.ts index d71af7be7d..bff3979b21 100644 --- a/data/mods/gen8/moves.ts +++ b/data/mods/gen8/moves.ts @@ -2,7 +2,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { allyswitch: { inherit: true, // Prevents setting the volatile used to check for Ally Switch failure - onPrepareHit() {}, + onPrepareHit: undefined, // no inherit }, anchorshot: { inherit: true, @@ -59,19 +59,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { charge: { inherit: true, condition: { - onStart(pokemon, source, effect) { - this.add('-start', pokemon, 'Charge'); - }, - onRestart(pokemon, source, effect) { - this.add('-start', pokemon, 'Charge'); - }, - onBasePowerPriority: 9, - onBasePower(basePower, attacker, defender, move) { - if (move.type === 'Electric') { - this.debug('charge boost'); - return this.chainModify(2); - } - }, + inherit: true, onMoveAborted(pokemon, target, move) { if (move.id !== 'charge') { pokemon.removeVolatile('charge'); @@ -82,9 +70,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { pokemon.removeVolatile('charge'); } }, - onEnd(pokemon) { - this.add('-end', pokemon, 'Charge', '[silent]'); - }, }, }, chatter: { @@ -526,9 +511,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { stickyweb: { inherit: true, condition: { - onSideStart(side) { - this.add('-sidestart', side, 'move: Sticky Web'); - }, + inherit: true, onSwitchIn(pokemon) { if (!pokemon.isGrounded() || pokemon.hasItem('heavydutyboots')) return; this.add('-activate', pokemon, 'move: Sticky Web'); diff --git a/data/mods/gen8/pokedex.ts b/data/mods/gen8/pokedex.ts index 4b0acb59d8..f2c5a8d20a 100644 --- a/data/mods/gen8/pokedex.ts +++ b/data/mods/gen8/pokedex.ts @@ -58,8 +58,8 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable vivillonfancy: { inherit: true, abilities: { 0: "Shield Dust", 1: "Compound Eyes" }, - prevo: undefined, - evoLevel: undefined, + prevo: undefined, // no inherit + evoLevel: undefined, // no inherit }, vivillonpokeball: { inherit: true, diff --git a/data/mods/gen8/rulesets.ts b/data/mods/gen8/rulesets.ts index 7958555cca..b430474530 100644 --- a/data/mods/gen8/rulesets.ts +++ b/data/mods/gen8/rulesets.ts @@ -2,19 +2,22 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable standard: { inherit: true, ruleset: [ - 'Obtainable', 'Team Preview', 'Sleep Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Items Clause', 'Evasion Moves Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod', + 'Standard AG', + 'Sleep Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Items Clause', 'Evasion Moves Clause', ], }, standarddoubles: { inherit: true, ruleset: [ - 'Obtainable', 'Team Preview', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Gravity Sleep Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod', + 'Standard AG', + 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Gravity Sleep Clause', ], }, standardoms: { inherit: true, ruleset: [ - 'Obtainable', 'Team Preview', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Endless Battle Clause', 'Dynamax Clause', 'HP Percentage Mod', 'Cancel Mod', 'Overflow Stat Mod', + 'Standard AG', + 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Dynamax Clause', 'Overflow Stat Mod', ], }, teampreview: { @@ -92,10 +95,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 +126,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/gen8linked/items.ts b/data/mods/gen8linked/items.ts deleted file mode 100644 index 2765c2ed4a..0000000000 --- a/data/mods/gen8linked/items.ts +++ /dev/null @@ -1,14 +0,0 @@ -export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { - leppaberry: { - inherit: true, - onUpdate(pokemon) { - if (!pokemon.hp) return; - const moveSlot = pokemon.getMoveData(pokemon.m.lastMoveAbsolute); - if (moveSlot?.pp === 0) { - pokemon.addVolatile('leppaberry'); - pokemon.volatiles['leppaberry'].moveSlot = moveSlot; - pokemon.eatItem(); - } - }, - }, -}; diff --git a/data/mods/gen8linked/moves.ts b/data/mods/gen8linked/moves.ts deleted file mode 100644 index 4cf9d26437..0000000000 --- a/data/mods/gen8linked/moves.ts +++ /dev/null @@ -1,466 +0,0 @@ -export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { - pursuit: { - inherit: true, - beforeTurnCallback(pokemon, target) { - // @ts-expect-error modded - const linkedMoves: [string, string] = pokemon.getLinkedMoves(); - if (linkedMoves.length) { - if (linkedMoves[0] !== 'pursuit' && linkedMoves[1] === 'pursuit') return; - } - - target.side.addSideCondition('pursuit', pokemon); - if (!target.side.sideConditions['pursuit'].sources) { - target.side.sideConditions['pursuit'].sources = []; - } - target.side.sideConditions['pursuit'].sources.push(pokemon); - }, - }, - mefirst: { - inherit: true, - onTryHit(target, pokemon) { - const action = this.queue.willMove(target); - if (action) { - // Mod-specific: Me First copies the first move in the link - // @ts-expect-error modded - const move = this.dex.getActiveMove(action.linked?.[0] || action.move); - if (move.category !== 'Status' && !move.flags['failmefirst']) { - pokemon.addVolatile('mefirst'); - this.actions.useMove(move, pokemon, { target }); - return null; - } - } - return false; - }, - }, - - // Modify Sucker Punch to check if both moves in a link are status - suckerpunch: { - inherit: true, - onTry(source, target) { - const action = this.queue.willMove(target); - if (!action || action.choice !== 'move') { - this.attrLastMove('[still]'); - this.add('-fail', source); - return null; - } - if (target.volatiles.mustrecharge && target.volatiles.mustrecharge.duration! < 2) { - // Duration may not be lower than 2 if Sucker Punch is used as a low-priority move - // i.e. if Sucker Punch is linked with a negative priority move - this.attrLastMove('[still]'); - this.add('-fail', source); - return null; - } - // @ts-expect-error modded - if (!action.linked) { - if (action.move.category === 'Status' && action.move.id !== 'mefirst') { - this.attrLastMove('[still]'); - this.add('-fail', source); - return null; - } - } else { - // @ts-expect-error modded - for (const linkedMove of action.linked) { - if (linkedMove.category !== 'Status' || linkedMove.id === 'mefirst') return; - } - this.attrLastMove('[still]'); - this.add('-fail', source); - return null; - } - }, - }, - - // Copy the last used move of a link - sketch: { - inherit: true, - onHit(target, source) { - const disallowedMoves = ['chatter', 'sketch', 'struggle']; - const lastMove: Move = target.m.lastMoveAbsolute; - if (source.transformed || !lastMove || disallowedMoves.includes(lastMove.id) || - source.moves.includes(lastMove.id) || lastMove.isZ) return false; - const sketchIndex = source.moves.indexOf('sketch'); - if (sketchIndex < 0) return false; - const move = this.dex.moves.get(lastMove); - const sketchedMove = { - move: move.name, - id: move.id, - pp: move.pp, - maxpp: move.pp, - target: move.target, - disabled: false, - used: false, - }; - source.moveSlots[sketchIndex] = sketchedMove; - source.baseMoveSlots[sketchIndex] = sketchedMove; - this.add('-activate', source, 'move: Sketch', move.name); - }, - }, - mimic: { - inherit: true, - onHit(target, source) { - const lastMove: Move = target.m.lastMoveAbsolute; - if (source.transformed || !lastMove || lastMove.flags['failmimic'] || - source.moves.includes(lastMove.id) || lastMove.isZ) return false; - const mimicIndex = source.moves.indexOf('mimic'); - if (mimicIndex < 0) return false; - const move = this.dex.moves.get(lastMove); - source.moveSlots[mimicIndex] = { - move: move.name, - id: move.id, - pp: move.pp, - maxpp: move.pp, - target: move.target, - disabled: false, - used: false, - virtual: true, - }; - this.add('-start', source, 'Mimic', move.name); - }, - }, - - // Copy/call last move of a link - instruct: { - inherit: true, - onHit(target, source) { - const lastMove: Move | ActiveMove | null = target.m.lastMoveAbsolute; - if (!lastMove || target.volatiles['dynamax']) return false; - const moveIndex = target.moves.indexOf(lastMove.id); - if ( - lastMove.flags['failinstruct'] || lastMove.isZ || lastMove.isMax || - lastMove.flags['charge'] || lastMove.flags['recharge'] || - target.volatiles['beakblast'] || target.volatiles['focuspunch'] || target.volatiles['shelltrap'] || - (target.moveSlots[moveIndex] && target.moveSlots[moveIndex].pp <= 0) - ) { - return false; - } - this.add('-singleturn', target, 'move: Instruct', `[of] ${source}`); - this.actions.runMove(lastMove.id, target, target.lastMoveTargetLoc!); - }, - }, - mirrormove: { - inherit: true, - onTryHit(target, pokemon) { - const move: Move | ActiveMove | null = target.m.lastMoveAbsolute; - if (!move?.flags['mirror'] || move.isZ || move.isMax) { - return false; - } - this.actions.useMove(move.id, pokemon, { target }); - return null; - }, - }, - - // Disabling effects - disable: { - inherit: true, - condition: { - duration: 5, - noCopy: true, // doesn't get copied by Baton Pass - onStart(pokemon, source, effect) { - const lastMove: Move | ActiveMove | null = pokemon.m.lastMoveAbsolute; - if ( - this.queue.willMove(pokemon) || - (pokemon === this.activePokemon && this.activeMove && !this.activeMove.isExternal) - ) { - this.effectState.duration!--; - } - if (!lastMove) { - this.debug('pokemon hasn\'t moved yet'); - return false; - } - for (const moveSlot of pokemon.moveSlots) { - if (moveSlot.id === lastMove.id) { - if (!moveSlot.pp) { - this.debug('Move out of PP'); - return false; - } else { - if (effect.id === 'cursedbody') { - this.add('-start', pokemon, 'Disable', moveSlot.move, '[from] ability: Cursed Body', `[of] ${source}`); - } else { - this.add('-start', pokemon, 'Disable', moveSlot.move); - } - this.effectState.move = lastMove.id; - return; - } - } - } - return false; - }, - onResidualOrder: 14, - onEnd(pokemon) { - this.add('-end', pokemon, 'Disable'); - }, - onBeforeMovePriority: 7, - onBeforeMove(attacker, defender, move) { - if (!move.isZ && move.id === this.effectState.move) { - this.add('cant', attacker, 'Disable', move); - return false; - } - }, - onDisableMove(pokemon) { - for (const moveSlot of pokemon.moveSlots) { - if (moveSlot.id === this.effectState.move) { - pokemon.disableMove(moveSlot.id); - } - } - }, - }, - }, - encore: { - inherit: true, - condition: { - duration: 3, - noCopy: true, // doesn't get copied by Z-Baton Pass - onStart(target) { - let lastMove: Move | ActiveMove | null = target.m.lastMoveAbsolute; - if (!lastMove || target.volatiles['dynamax']) return false; - if ((lastMove as ActiveMove).isZOrMaxPowered) lastMove = this.dex.moves.get(lastMove.baseMove); - // @ts-expect-error modded - const linkedMoves: [string, string] = target.getLinkedMoves(true); - const moveIndex = target.moves.indexOf(lastMove.id); - if (linkedMoves.includes(lastMove.id) && this.dex.moves.get((linkedMoves[0])).flags['failencore'] && - this.dex.moves.get((linkedMoves[1])).flags['failencore']) { - // both moves cannot be encored - delete target.volatiles['encore']; - return false; - } - if (lastMove.isZ || lastMove.flags['failencore'] || - (target.moveSlots[moveIndex] && target.moveSlots[moveIndex].pp <= 0)) { - // it failed - delete target.volatiles['encore']; - return false; - } - this.effectState.turnsActivated = {}; - this.effectState.move = lastMove.id; - this.add('-start', target, 'Encore'); - if (linkedMoves.includes(lastMove.id)) { - this.effectState.move = linkedMoves; - } - if (!this.queue.willMove(target)) { - this.effectState.duration!++; - } - }, - onOverrideAction(pokemon, target, move) { - if (!this.effectState.turnsActivated[this.turn]) { - // Initialize Encore effect for this turn - this.effectState.turnsActivated[this.turn] = 0; - } else if ( - this.effectState.turnsActivated[this.turn] >= (Array.isArray(this.effectState.move) ? - this.effectState.move.length : 1)) { - // Finish Encore effect for this turn - return; - } - this.effectState.turnsActivated[this.turn]++; - if (!Array.isArray(this.effectState.move)) { - this.queue.cancelAction(pokemon); - if (move.id !== this.effectState.move) return this.effectState.move; - return; - } - - // Locked into a link - switch (this.effectState.turnsActivated[this.turn]) { - case 1: { - if (this.effectState.move[0] !== move.id) return this.effectState.move[0]; - return; - } - case 2: - if (this.effectState.move[1] !== move.id) return this.effectState.move[1]; - return; - } - }, - onResidualOrder: 13, - onResidual(target) { - // early termination if you run out of PP - const lastMove = target.m.lastMoveAbsolute; - const index = target.moves.indexOf(lastMove.id); - if (index === -1) return; // no last move - - // @ts-expect-error modded - if (target.hasLinkedMove(lastMove.id)) { - // TODO: Check instead whether the last executed move was linked - if (target.moveSlots[0].pp <= 0 || target.moveSlots[1].pp <= 0) { - delete target.volatiles.encore; - this.add('-end', target, 'Encore'); - } - } else { - if (target.moveSlots[index].pp <= 0) { - delete target.volatiles.encore; - this.add('-end', target, 'Encore'); - } - } - }, - onEnd(target) { - this.add('-end', target, 'Encore'); - }, - onDisableMove(pokemon) { - if (Array.isArray(this.effectState.move)) { - for (const moveSlot of pokemon.moveSlots) { - if (moveSlot.id !== this.effectState.move[0] && moveSlot.id !== this.effectState.move[1]) { - pokemon.disableMove(moveSlot.id); - } - } - } - if (!this.effectState.move || !pokemon.hasMove(this.effectState.move)) { - return; - } - for (const moveSlot of pokemon.moveSlots) { - if (moveSlot.id !== this.effectState.move) { - pokemon.disableMove(moveSlot.id); - } - } - }, - }, - }, - torment: { - inherit: true, - condition: { - noCopy: true, - onStart(pokemon) { - if (pokemon.volatiles['dynamax']) { - delete pokemon.volatiles['torment']; - return false; - } - this.add('-start', pokemon, 'Torment'); - }, - onEnd(pokemon) { - this.add('-end', pokemon, 'Torment'); - }, - onDisableMove(pokemon) { - const lastMove = pokemon.lastMove; - if (!lastMove || lastMove.id === 'struggle') return; - - if (Array.isArray(lastMove)) { - for (const move of lastMove) { - pokemon.disableMove(move.id); - } - } else { - pokemon.disableMove(lastMove.id); - } - }, - }, - }, - - // PP-decreasing moves - grudge: { - inherit: true, - condition: { - onStart(pokemon) { - this.add('-singlemove', pokemon, 'Grudge'); - }, - onFaint(target, source, effect) { - if (!source || source.fainted || !effect) return; - const lastMove: Move | ActiveMove | null = source.m.lastMoveAbsolute; - if (effect.effectType === 'Move' && !effect.flags['futuremove'] && lastMove) { - for (const moveSlot of source.moveSlots) { - if (moveSlot.id === lastMove.id) { - moveSlot.pp = 0; - this.add('-activate', source, 'move: Grudge', this.dex.moves.get(lastMove.id).name); - } - } - } - }, - onBeforeMovePriority: 100, - onBeforeMove(pokemon) { - if (pokemon.moveThisTurn) return; // Second stage of a Linked move - this.debug('removing Grudge before attack'); - pokemon.removeVolatile('grudge'); - }, - }, - }, - spite: { - inherit: true, - onHit(target) { - const lastMove: Move | ActiveMove | null = target.m.lastMoveAbsolute; - if (!lastMove || lastMove.isZ || lastMove.isMax) return false; - const ppDeducted = target.deductPP(lastMove.id, 4); - if (!ppDeducted) return false; - this.add("-activate", target, 'move: Spite', lastMove.name, ppDeducted); - }, - }, - - // Other lastMove checks - conversion2: { - inherit: true, - onHit(target, source) { - const lastMove: Move | ActiveMove | null = target.m.lastMoveAbsolute; - if (!lastMove) return false; - const possibleTypes = []; - const attackType = lastMove.type; - for (const typeName of this.dex.types.names()) { - if (source.hasType(typeName)) continue; - const typeCheck = this.dex.types.get(typeName).damageTaken[attackType]; - if (typeCheck === 2 || typeCheck === 3) { - possibleTypes.push(typeName); - } - } - if (!possibleTypes.length) { - return false; - } - const randomType = this.sample(possibleTypes); - - if (!source.setType(randomType)) return false; - this.add('-start', source, 'typechange', randomType); - }, - }, - destinybond: { - inherit: true, - condition: { - onStart(pokemon) { - this.add('-singlemove', pokemon, 'Destiny Bond'); - }, - onFaint(target, source, effect) { - if (!source || !effect || target.side === source.side) return; - if (effect.effectType === 'Move' && !effect.flags['futuremove']) { - if (source.volatiles['dynamax']) { - this.add('-hint', "Dynamaxed Pokémon are immune to Destiny Bond."); - return; - } - this.add('-activate', target, 'move: Destiny Bond'); - source.faint(); - } - }, - onBeforeMovePriority: -1, - onBeforeMove(pokemon, target, move) { - // Second stage of a Linked move does not remove Destiny Bond - if (pokemon.moveThisTurn || move.id === 'destinybond') return; - this.debug('removing Destiny Bond before attack'); - pokemon.removeVolatile('destinybond'); - }, - onMoveAborted(pokemon, target, move) { - pokemon.removeVolatile('destinybond'); - }, - }, - }, - iceball: { - inherit: true, - condition: { - duration: 1, - onLockMove: 'iceball', - onStart() { - this.effectState.hitCount = 0; - }, - onResidual(target) { - // This is just to ensure the volatile is deleted correctly - const lastMove: Move | ActiveMove | null = target.m.lastMoveAbsolute; - if (lastMove?.id === 'struggle') { - delete target.volatiles['iceball']; - } - }, - }, - }, - rollout: { - inherit: true, - condition: { - duration: 1, - onLockMove: 'rollout', - onStart() { - this.effectState.hitCount = 0; - }, - onResidual(target) { - // This is just to ensure the volatile is deleted correctly - const lastMove: Move | ActiveMove | null = target.m.lastMoveAbsolute; - if (lastMove?.id === 'struggle') { - delete target.volatiles['rollout']; - } - }, - }, - }, -}; diff --git a/data/mods/gen9dlc1/abilities.ts b/data/mods/gen9dlc1/abilities.ts index 4f06cf465d..dd1bf0c857 100644 --- a/data/mods/gen9dlc1/abilities.ts +++ b/data/mods/gen9dlc1/abilities.ts @@ -19,91 +19,60 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa } }, condition: { - noCopy: true, - onStart(pokemon, source, effect) { - if (effect?.name === 'Booster Energy') { - this.effectState.fromBooster = true; - this.add('-activate', pokemon, 'ability: Protosynthesis', '[fromitem]'); - } else { - this.add('-activate', pokemon, 'ability: Protosynthesis'); - } - this.effectState.bestStat = pokemon.getBestStat(false, true); - this.add('-start', pokemon, 'protosynthesis' + this.effectState.bestStat); - }, - onModifyAtkPriority: 5, - onModifyAtk(atk, pokemon) { + inherit: true, + onModifyAtk() { if (this.effectState.bestStat !== 'atk') return; this.debug('Protosynthesis atk boost'); return this.chainModify([5325, 4096]); }, - onModifyDefPriority: 6, - onModifyDef(def, pokemon) { + onModifyDef() { if (this.effectState.bestStat !== 'def') return; this.debug('Protosynthesis def boost'); return this.chainModify([5325, 4096]); }, - onModifySpAPriority: 5, - onModifySpA(spa, pokemon) { + onModifySpA() { if (this.effectState.bestStat !== 'spa') return; this.debug('Protosynthesis spa boost'); return this.chainModify([5325, 4096]); }, - onModifySpDPriority: 6, - onModifySpD(spd, pokemon) { + onModifySpD() { if (this.effectState.bestStat !== 'spd') return; this.debug('Protosynthesis spd boost'); return this.chainModify([5325, 4096]); }, - onModifySpe(spe, pokemon) { + onModifySpe() { if (this.effectState.bestStat !== 'spe') return; this.debug('Protosynthesis spe boost'); return this.chainModify(1.5); }, - onEnd(pokemon) { - this.add('-end', pokemon, 'Protosynthesis'); - }, }, flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, notransform: 1, cantsuppress: 1 }, }, quarkdrive: { inherit: true, condition: { - noCopy: true, - onStart(pokemon, source, effect) { - if (effect?.name === 'Booster Energy') { - this.effectState.fromBooster = true; - this.add('-activate', pokemon, 'ability: Quark Drive', '[fromitem]'); - } else { - this.add('-activate', pokemon, 'ability: Quark Drive'); - } - this.effectState.bestStat = pokemon.getBestStat(false, true); - this.add('-start', pokemon, 'quarkdrive' + this.effectState.bestStat); - }, - onModifyAtkPriority: 5, - onModifyAtk(atk, pokemon) { + inherit: true, + onModifyAtk() { if (this.effectState.bestStat !== 'atk') return; this.debug('Quark Drive atk boost'); return this.chainModify([5325, 4096]); }, - onModifyDefPriority: 6, - onModifyDef(def, pokemon) { + onModifyDef() { if (this.effectState.bestStat !== 'def') return; this.debug('Quark Drive def boost'); return this.chainModify([5325, 4096]); }, - onModifySpAPriority: 5, - onModifySpA(spa, pokemon) { + onModifySpA() { if (this.effectState.bestStat !== 'spa') return; this.debug('Quark Drive spa boost'); return this.chainModify([5325, 4096]); }, - onModifySpDPriority: 6, - onModifySpD(spd, pokemon) { + onModifySpD() { if (this.effectState.bestStat !== 'spd') return; this.debug('Quark Drive spd boost'); return this.chainModify([5325, 4096]); }, - onModifySpe(spe, pokemon) { + onModifySpe() { if (this.effectState.bestStat !== 'spe') return; this.debug('Quark Drive spe boost'); return this.chainModify(1.5); diff --git a/data/mods/gen9dlc1/scripts.ts b/data/mods/gen9dlc1/scripts.ts index 7c97daa056..c8d77bc7e9 100644 --- a/data/mods/gen9dlc1/scripts.ts +++ b/data/mods/gen9dlc1/scripts.ts @@ -11,7 +11,7 @@ export const Scripts: ModdedBattleScriptsData = { } if (pokemon.species.baseSpecies === 'Ogerpon' && !['Fire', 'Grass', 'Rock', 'Water'].includes(pokemon.teraType) && (!pokemon.illusion || pokemon.illusion.species.baseSpecies === 'Ogerpon')) { - this.battle.hint("If Ogerpon Terastallizes into a type other than Fire, Grass, Rock, or Water, the game softlocks."); + this.battle.hint("If Ogerpon Terastallizes into a type other than Fire, Grass, Rock, or Water, the game crashes.", false, pokemon.side); return; } @@ -87,16 +87,18 @@ export const Scripts: ModdedBattleScriptsData = { this.hpType = (this.battle.gen >= 5 ? this.hpType : pokemon.hpType); this.hpPower = (this.battle.gen >= 5 ? this.hpPower : pokemon.hpPower); this.timesAttacked = pokemon.timesAttacked; - for (const moveSlot of pokemon.moveSlots) { + for (const [i, moveSlot] of pokemon.moveSlots.entries()) { let moveName = moveSlot.move; if (moveSlot.id === 'hiddenpower') { moveName = 'Hidden Power ' + this.hpType; } + const move = this.battle.dex.moves.get(moveSlot.id); + const pp = Math.min(5, move.pp); this.moveSlots.push({ move: moveName, id: moveSlot.id, - pp: moveSlot.maxpp === 1 ? 1 : 5, - maxpp: this.battle.gen >= 5 ? (moveSlot.maxpp === 1 ? 1 : 5) : moveSlot.maxpp, + pp, + maxpp: this.battle.gen >= 5 ? pp : this.battle.calculatePP(move, this.ppUps[i] || 0), target: moveSlot.target, disabled: false, used: false, diff --git a/data/mods/gen9legendsou/abilities.ts b/data/mods/gen9legendsou/abilities.ts new file mode 100644 index 0000000000..770a01461d --- /dev/null +++ b/data/mods/gen9legendsou/abilities.ts @@ -0,0 +1,18 @@ +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { + dragonize: { + inherit: true, + isNonstandard: null, + }, + megasol: { + inherit: true, + isNonstandard: null, + }, + piercingdrill: { + inherit: true, + isNonstandard: null, + }, + spicyspray: { + inherit: true, + isNonstandard: null, + }, +}; diff --git a/data/mods/gen9legendsou/formats-data.ts b/data/mods/gen9legendsou/formats-data.ts index f2fe733967..691d610cf2 100644 --- a/data/mods/gen9legendsou/formats-data.ts +++ b/data/mods/gen9legendsou/formats-data.ts @@ -90,7 +90,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "OU", }, clefablemega: { - tier: "(OU)", + tier: "OU", }, igglybuff: { tier: "LC", @@ -717,7 +717,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "Uber", }, lucariomegaz: { - tier: "OU", + tier: "UU", }, hippopotas: { tier: "LC", @@ -774,7 +774,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "OU", }, heatranmega: { - tier: "OU", + tier: "(OU)", }, darkrai: { tier: "OU", @@ -999,7 +999,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "UU", }, chesnaughtmega: { - tier: "UU", + tier: "OU", }, fennekin: { tier: "LC", @@ -1041,7 +1041,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "NFE", }, talonflame: { - tier: "OU", + tier: "UU", }, scatterbug: { tier: "LC", @@ -1101,16 +1101,16 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "LC", }, meowstic: { - tier: "OU", + tier: "UU", }, meowsticf: { - tier: "OU", + tier: "UU", }, meowsticmmega: { - tier: "(OU)", + tier: "UU", }, meowsticfmega: { - tier: "(OU)", + tier: "UU", }, honedge: { tier: "LC", @@ -1313,7 +1313,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "UU", }, golisopodmega: { - tier: "OU", + tier: "UU", }, sandygast: { tier: "LC", @@ -1349,7 +1349,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat tier: "OU", }, zeraoramega: { - tier: "OU", + tier: "(OU)", }, meltan: { tier: "UU", 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/pokedex.ts b/data/mods/gen9legendsou/pokedex.ts index 398847927c..ac1e5969ce 100644 --- a/data/mods/gen9legendsou/pokedex.ts +++ b/data/mods/gen9legendsou/pokedex.ts @@ -1,12 +1,4 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { - clefablemega: { - inherit: true, - abilities: { 0: "Prankster" }, - }, - victreebelmega: { - inherit: true, - abilities: { 0: "Triage" }, - }, raichumegax: { inherit: true, abilities: { 0: "Levitate" }, @@ -18,19 +10,6 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable starmiemega: { inherit: true, baseStats: { hp: 60, atk: 100, def: 105, spa: 130, spd: 105, spe: 120 }, - abilities: { 0: "Pure Power" }, - }, - dragonitemega: { - inherit: true, - abilities: { 0: "Sheer Force" }, - }, - meganiummega: { - inherit: true, - abilities: { 0: "Flower Veil" }, - }, - feraligatrmega: { - inherit: true, - abilities: { 0: "Dragon's Maw" }, }, ampharosmega: { inherit: true, @@ -40,14 +19,6 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable inherit: true, abilities: { 0: "Technician" }, }, - chimechomega: { - inherit: true, - abilities: { 0: "Levitate" }, - }, - skarmorymega: { - inherit: true, - abilities: { 0: "Tough Claws" }, - }, mawilemega: { inherit: true, baseStats: { hp: 50, atk: 105, def: 125, spa: 55, spd: 95, spe: 50 }, @@ -64,10 +35,6 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable inherit: true, abilities: { 0: "Sharpness" }, }, - froslassmega: { - inherit: true, - abilities: { 0: "Snow Warning" }, - }, garchompmegaz: { inherit: true, abilities: { 0: "Rough Skin" }, @@ -84,18 +51,6 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable inherit: true, abilities: { 0: "Dark Aura" }, }, - emboarmega: { - inherit: true, - abilities: { 0: "Supreme Overlord" }, - }, - excadrillmega: { - inherit: true, - abilities: { 0: "Sand Rush" }, - }, - golurkmega: { - inherit: true, - abilities: { 0: "Adaptability" }, - }, audinomega: { inherit: true, abilities: { 0: "Regenerator" }, @@ -112,30 +67,6 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable inherit: true, abilities: { 0: "Hadron Engine" }, }, - chandeluremega: { - inherit: true, - abilities: { 0: "Magic Guard" }, - }, - chesnaughtmega: { - inherit: true, - abilities: { 0: "Grassy Surge" }, - }, - delphoxmega: { - inherit: true, - abilities: { 0: "Levitate" }, - }, - greninjamega: { - inherit: true, - abilities: { 0: "Protean" }, - }, - meowsticmmega: { - inherit: true, - abilities: { 0: "Psychic Surge" }, - }, - meowsticfmega: { - inherit: true, - abilities: { 0: "Psychic Surge" }, - }, pyroarmega: { inherit: true, abilities: { 0: "Drought" }, @@ -144,10 +75,6 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable inherit: true, abilities: { 0: "Regenerator" }, }, - floettemega: { - inherit: true, - abilities: { 0: "Regenerator" }, - }, malamarmega: { inherit: true, abilities: { 0: "Contrary" }, @@ -156,26 +83,14 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable inherit: true, abilities: { 0: "Tough Claws" }, }, - hawluchamega: { - inherit: true, - abilities: { 0: "Stamina" }, - }, zygardemega: { inherit: true, abilities: { 0: "Aura Break" }, }, - crabominablemega: { - inherit: true, - abilities: { 0: "Ice Scales" }, - }, golisopodmega: { inherit: true, abilities: { 0: "Heatproof" }, }, - drampamega: { - inherit: true, - abilities: { 0: "Adaptability" }, - }, magearnamega: { inherit: true, abilities: { 0: "Soul-Heart" }, @@ -192,14 +107,6 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable inherit: true, abilities: { 0: "Dauntless Shield" }, }, - scovillainmega: { - inherit: true, - abilities: { 0: "Contrary" }, - }, - glimmoramega: { - inherit: true, - abilities: { 0: "Levitate" }, - }, tatsugiricurlymega: { inherit: true, abilities: { 0: "Drizzle" }, 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/gen9predlc/abilities.ts b/data/mods/gen9predlc/abilities.ts index 9cc18a8ce4..1078f9d63c 100644 --- a/data/mods/gen9predlc/abilities.ts +++ b/data/mods/gen9predlc/abilities.ts @@ -13,8 +13,8 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa }, illuminate: { inherit: true, - onTryBoost() {}, - onModifyMove() {}, + onTryBoost: undefined, // no inherit + onModifyMove: undefined, // no inherit flags: {}, rating: 0, }, diff --git a/data/mods/gen9predlc/moves.ts b/data/mods/gen9predlc/moves.ts index 1af9032814..6c66c3f344 100644 --- a/data/mods/gen9predlc/moves.ts +++ b/data/mods/gen9predlc/moves.ts @@ -37,7 +37,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, jetpunch: { inherit: true, - hasSheerForce: true, + hasSheerForceBoost: true, }, matchagotcha: { inherit: true, diff --git a/data/mods/gen9regeneration/abilities.ts b/data/mods/gen9regeneration/abilities.ts new file mode 100644 index 0000000000..777b39548f --- /dev/null +++ b/data/mods/gen9regeneration/abilities.ts @@ -0,0 +1,277 @@ +export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { + // new + wingsofvictory: { + onStart(pokemon) { + if (pokemon.side.foe.totalFainted) { + this.add('-activate', pokemon, 'ability: Wings of Victory'); + const fallen = Math.min(pokemon.side.foe.totalFainted, 5); + this.add('-start', pokemon, `fallen${fallen}`, '[silent]'); + this.effectState.fallen = fallen; + } + }, + onEnd(pokemon) { + this.add('-end', pokemon, `fallen${this.effectState.fallen}`, '[silent]'); + }, + onBasePowerPriority: 21, + onBasePower(basePower, attacker, defender, move) { + if (this.effectState.fallen) { + const powMod = [4096, 4506, 4915, 5325, 5734, 6144]; + this.debug(`Wings of Victory boost: ${powMod[this.effectState.fallen]}/4096`); + return this.chainModify([powMod[this.effectState.fallen], 4096]); + } + }, + name: "Wings of Victory", + shortDesc: "This Pokemon's moves have 10% more power for each fainted foe, up to 5 foes.", + rating: 3.5, + }, + galaxybrain: { + onStart(pokemon) { + let totalatk = 0; + let totalspa = 0; + for (const target of pokemon.side.foe.active) { + if (!target || target.fainted) continue; + totalatk += target.getStat('atk', false, true); + totalspa += target.getStat('spa', false, true); + } + if (totalatk && totalatk >= totalspa) { + this.boost({ def: 1 }); + } else if (totalspa) { + this.boost({ spd: 1 }); + } + }, + name: "Galaxy Brain", + shortDesc: "On switch-in, Defense or Sp. Def is raised 1 stage based on the foes' stronger offense.", + rating: 4, + }, + blackout: { + onStart(source) { + this.field.addPseudoWeather('magicroom', source); + /* let activated = false; + for (const pokemon of this.getAllActive()) { + if (!activated) { + this.add('-ability', source, 'Blackout'); + } + activated = true; + if (!pokemon.volatiles['embargo']) { + pokemon.addVolatile('embargo'); + } + } */ + }, + /* onAnySwitchIn(pokemon) { + if (!pokemon.volatiles['embargo']) { + pokemon.addVolatile('embargo'); + } + }, */ + onEnd(pokemon) { + this.field.removePseudoWeather('magicroom'); + /* for (const target of this.getAllActive()) { + if (target === pokemon) continue; + if (target.hasAbility('blackout')) return; + } + for (const target of this.getAllActive()) { + target.removeVolatile('embargo'); + } */ + }, + name: "Blackout", + shortDesc: "While this Pokemon is active, all held items are disabled.", + rating: 5, + }, + excavate: { + onSwitchIn(pokemon) { + let activated = false; + for (const sideCondition of ['spikes', 'stealthrock']) { + if (pokemon.side.getSideCondition(sideCondition) && !pokemon.side.getSideCondition('excavate')) { + if (!activated) { + this.add('-activate', pokemon, 'ability: Excavate'); + activated = true; + } + } + if (pokemon.side.getSideCondition('spikes') && !pokemon.side.getSideCondition('excavate')) { + this.add('-sideend', pokemon.side, 'move: Spikes', `[of] ${pokemon}`); + pokemon.side.removeSideCondition('spikes'); + this.boost({ def: 1 }, pokemon); + pokemon.side.addSideCondition('excavate'); + } + if (pokemon.side.getSideCondition('stealthrock') && !pokemon.side.getSideCondition('excavate')) { + this.add('-sideend', pokemon.side, 'move: Stealth Rock', `[of] ${pokemon}`); + pokemon.side.removeSideCondition('stealthrock'); + this.boost({ def: 1 }, pokemon); + pokemon.side.addSideCondition('excavate'); + } + } + }, + condition: { + onSideStart(side) { + this.add('-sidestart', side, 'move: Excavate Used'); + }, + }, + name: "Excavate", + shortDesc: "Once per game. Removes Stealth Rock and Spikes on switch-in, +1 Def for each hazard removed.", + rating: 4, + }, + lifeguard: { + onDamagingHit(damage, target, source, move) { + if (move.type === 'Water') { + this.boost({ def: 1 }); + } + }, + onModifySecondaries(secondaries, target, source, move) { + if (move.type === 'Water') return; + this.debug('Lifeguard prevent secondary'); + return secondaries.filter(effect => !!effect.self); + }, + name: "Lifeguard", + shortDesc: "Boosts Defense when hit by a Water move; blocks additional effects of Water moves.", + rating: 3, + }, + ballooning: { + onDamage(damage, target, source, effect) { + if ( + effect.effectType === "Move" && + !effect.multihit && + !(effect.hasSheerForce && source.hasAbility('sheerforce')) + ) { + this.effectState.checkedBallooning = false; + } else { + this.effectState.checkedBallooning = true; + } + }, + onTryEatItem(item) { + const healingItems = [ + 'aguavberry', 'enigmaberry', 'figyberry', 'iapapaberry', + 'magoberry', 'sitrusberry', 'wikiberry', 'oranberry', 'berryjuice', + ]; + if (healingItems.includes(item.id)) { + return this.effectState.checkedBallooning; + } + return true; + }, + onAfterMoveSecondary(target, source, move) { + this.effectState.checkedBallooning = true; + if (!source || source === target || !target.hp || !move.totalDamage) return; + const lastAttackedBy = target.getLastAttackedBy(); + if (!lastAttackedBy) return; + const damage = move.multihit ? move.totalDamage : lastAttackedBy.damage; + if (target.hp <= target.maxhp / 2 && target.hp + damage > target.maxhp / 2) { + this.boost({ atk: 1, spa: 1, spe: 1 }, target, target); + target.addVolatile('perishsong'); + } + }, + name: "Ballooning", + shortDesc: "At 1/2 or less of this Pokemon's max HP: +1 Atk, Sp. Atk, Spe, and gains the Perish Song effect.", + rating: 4, + }, + ofafeather: { + onModifyAtkPriority: 5, + onModifyAtk(atk, attacker, defender, move) { + if (move.type === 'Flying') { + this.debug('Of A Feather boost'); + return this.chainModify(1.5); + } + }, + onModifySpAPriority: 5, + onModifySpA(atk, attacker, defender, move) { + if (move.type === 'Flying') { + this.debug('Of A Feather boost'); + return this.chainModify(1.5); + } + }, + name: "Of A Feather", + rating: 3.5, + shortDesc: "This Pokemon's Flying-type moves have 1.5x power.", + }, + patriarch: { + onStart(pokemon) { + if (pokemon.side.pokemon.filter(ally => ally === pokemon || !ally.fainted && !ally.status)) { + this.add('-activate', pokemon, 'ability: Patriarch'); + const healthy = Math.min(pokemon.side.pokemon + .filter(ally => ally === pokemon || !ally.fainted && !ally.status).length, 5); + this.add('-start', pokemon, `healthy{healthy}`, '[silent]'); + this.effectState.healthy = healthy; + } + }, + onEnd(pokemon) { + this.add('-end', pokemon, `healthy${this.effectState.healthy}`, '[silent]'); + }, + onBasePowerPriority: 21, + onBasePower(basePower, attacker, defender, move) { + if (this.effectState.healthy) { + const powMod = [4096, 4506, 4915, 5325, 5734, 6144]; + this.debug(`Patriach boost: ${powMod[this.effectState.healthy]}/4096`); + return this.chainModify([powMod[this.effectState.healthy], 4096]); + } + }, + name: "Patriarch", + shortDesc: "This Pokemon's moves have 10% more power for each of its healthy allies.", + rating: 3.5, + }, + violentabandon: { + onAfterUseItem(item, pokemon) { + if ( + pokemon !== this.effectState.target && + pokemon.baseSpecies.baseSpecies !== 'Gyarados' || + pokemon.transformed + ) { + return; + } + if (pokemon.species.forme !== 'Mega') { + pokemon.formeChange('Gyarados-Mega', this.effect, true); + } + }, + onTakeItem(item, pokemon) { + if ( + pokemon !== this.effectState.target && + pokemon.baseSpecies.baseSpecies !== 'Gyarados' || + pokemon.transformed + ) { + return; + } + if (pokemon.species.forme !== 'Mega') { + pokemon.formeChange('Gyarados-Mega', this.effect, true); + } + }, + flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 }, + name: "Violent Abandon", + shortDesc: "This Pokemon transforms into Mega Gyarados whenever its item is used or lost.", + rating: 3.5, + }, + tropicalcurrent: { + onDamagePriority: 1, + onDamage(damage, target, source, effect) { + if (effect.id === 'brn') { + this.heal(target.baseMaxhp / 8); + return false; + } + }, + name: "Tropical Current", + shortDesc: "This Pokemon restored 1/8 of its max HP per turn if it's burned. Ignores burn attack drop.", + rating: 4, + }, + bullspirit: { + onAfterMoveSecondarySelf(source, target, move) { + if (!move || source.switchFlag === true || !move.hitTargets || move.type !== 'Normal') return; + this.add('-ability', source, 'Bull Spirit'); + this.add('-message', `${source.name}'s next attack will be physical!`); + source.addVolatile('bullspirit'); + }, + condition: { + onStart(target) { + this.add('-start', target, 'ability: Bull Spirit'); + }, + duration: 2, + onModifyMovePriority: 8, + onModifyMove(move, pokemon) { + if (move.category !== "Status") { + move.category = "Physical"; + } + }, + onEnd(target) { + this.add('-end', target, 'ability: Bull Spirit', '[silent]'); + }, + }, + flags: {}, + name: "Bull Spirit", + rating: 1, + shortDesc: "After using a Normal-type move, the user's next attack will always be physical.", + }, +}; diff --git a/data/mods/gen9regeneration/formats-data.ts b/data/mods/gen9regeneration/formats-data.ts new file mode 100644 index 0000000000..b409dc025c --- /dev/null +++ b/data/mods/gen9regeneration/formats-data.ts @@ -0,0 +1,674 @@ +export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { + bulbasaur: { + tier: "LC", + doublesTier: "LC", + }, + ivysaur: { + tier: "NFE", + doublesTier: "NFE", + }, + venusaur: { + tier: "OU", + doublesTier: "DOU", + }, + venusaurmega: { + isNonstandard: "Past", + tier: "Illegal", + }, + charmander: { + tier: "LC", + doublesTier: "LC", + }, + charmeleon: { + tier: "NFE", + doublesTier: "NFE", + }, + charizard: { + tier: "OU", + doublesTier: "DOU", + }, + charizardmegax: { + isNonstandard: "Past", + tier: "Illegal", + }, + charizardmegay: { + isNonstandard: "Past", + tier: "Illegal", + }, + squirtle: { + tier: "LC", + doublesTier: "LC", + }, + wartortle: { + tier: "NFE", + doublesTier: "NFE", + }, + blastoise: { + tier: "OU", + doublesTier: "DOU", + }, + blastoisemega: { + isNonstandard: "Past", + tier: "Illegal", + }, + caterpie: { + tier: "LC", + doublesTier: "LC", + }, + metapod: { + tier: "NFE", + doublesTier: "NFE", + }, + butterfree: { + tier: "OU", + doublesTier: "DOU", + }, + weedle: { + tier: "LC", + doublesTier: "LC", + }, + kakuna: { + tier: "NFE", + doublesTier: "NFE", + }, + beedrill: { + tier: "OU", + doublesTier: "DOU", + }, + beedrillmega: { + isNonstandard: "Past", + tier: "Illegal", + }, + pidgey: { + tier: "LC", + doublesTier: "LC", + }, + pidgeotto: { + tier: "NFE", + doublesTier: "NFE", + }, + pidgeot: { + tier: "OU", + doublesTier: "DOU", + }, + pidgeotmega: { + isNonstandard: "Past", + tier: "Illegal", + }, + rattata: { + tier: "LC", + doublesTier: "LC", + }, + raticate: { + tier: "OU", + doublesTier: "DOU", + }, + spearow: { + tier: "LC", + doublesTier: "LC", + }, + fearow: { + tier: "OU", + doublesTier: "DOU", + }, + ekans: { + tier: "LC", + doublesTier: "LC", + }, + arbok: { + tier: "OU", + doublesTier: "DOU", + }, + pikachu: { + tier: "LC", + doublesTier: "LC", + }, + raichu: { + tier: "OU", + doublesTier: "DOU", + }, + sandshrew: { + tier: "LC", + doublesTier: "LC", + }, + sandslash: { + tier: "OU", + doublesTier: "DOU", + }, + nidoranf: { + tier: "LC", + doublesTier: "LC", + }, + nidorina: { + tier: "NFE", + doublesTier: "NFE", + }, + nidoqueen: { + tier: "OU", + doublesTier: "DOU", + }, + nidoranm: { + tier: "LC", + doublesTier: "LC", + }, + nidorino: { + tier: "NFE", + doublesTier: "NFE", + }, + nidoking: { + tier: "OU", + doublesTier: "DOU", + }, + cleffa: { + tier: "LC", + doublesTier: "LC", + }, + clefairy: { + tier: "NFE", + doublesTier: "NFE", + }, + clefable: { + tier: "OU", + doublesTier: "DOU", + }, + vulpix: { + tier: "LC", + doublesTier: "LC", + }, + ninetales: { + tier: "OU", + doublesTier: "DOU", + }, + igglybuff: { + tier: "LC", + doublesTier: "LC", + }, + jigglypuff: { + tier: "NFE", + doublesTier: "NFE", + }, + wigglytuff: { + tier: "OU", + doublesTier: "DOU", + }, + zubat: { + tier: "LC", + doublesTier: "LC", + }, + golbat: { + tier: "OU", + doublesTier: "DOU", + }, + oddish: { + tier: "LC", + doublesTier: "LC", + }, + gloom: { + tier: "NFE", + doublesTier: "NFE", + }, + vileplume: { + tier: "OU", + doublesTier: "DOU", + }, + paras: { + tier: "LC", + doublesTier: "LC", + }, + parasect: { + tier: "OU", + doublesTier: "DOU", + }, + venonat: { + tier: "LC", + doublesTier: "LC", + }, + venomoth: { + tier: "OU", + doublesTier: "DOU", + }, + diglett: { + tier: "LC", + doublesTier: "LC", + }, + dugtrio: { + tier: "OU", + doublesTier: "DOU", + }, + meowth: { + tier: "LC", + doublesTier: "LC", + }, + persian: { + tier: "OU", + doublesTier: "DOU", + }, + psyduck: { + tier: "LC", + doublesTier: "LC", + }, + golduck: { + tier: "OU", + doublesTier: "DOU", + }, + mankey: { + tier: "LC", + doublesTier: "LC", + }, + primeape: { + tier: "OU", + doublesTier: "DOU", + }, + growlithe: { + tier: "LC", + doublesTier: "LC", + }, + arcanine: { + tier: "OU", + doublesTier: "DOU", + }, + poliwag: { + tier: "LC", + doublesTier: "LC", + }, + poliwhirl: { + tier: "NFE", + doublesTier: "NFE", + }, + poliwrath: { + tier: "OU", + doublesTier: "DOU", + }, + abra: { + tier: "LC", + doublesTier: "LC", + }, + kadabra: { + tier: "NFE", + doublesTier: "NFE", + }, + alakazam: { + tier: "OU", + doublesTier: "DOU", + }, + alakazammega: { + isNonstandard: "Past", + tier: "Illegal", + }, + machop: { + tier: "LC", + doublesTier: "LC", + }, + machoke: { + tier: "NFE", + doublesTier: "NFE", + }, + machamp: { + tier: "OU", + doublesTier: "DOU", + }, + bellsprout: { + tier: "LC", + doublesTier: "LC", + }, + weepinbell: { + tier: "NFE", + doublesTier: "NFE", + }, + victreebel: { + tier: "OU", + doublesTier: "DOU", + }, + tentacool: { + tier: "LC", + doublesTier: "LC", + }, + tentacruel: { + tier: "OU", + doublesTier: "DOU", + }, + geodude: { + tier: "LC", + doublesTier: "LC", + }, + graveler: { + tier: "NFE", + doublesTier: "NFE", + }, + golem: { + tier: "OU", + doublesTier: "DOU", + }, + ponyta: { + tier: "LC", + doublesTier: "LC", + }, + rapidash: { + tier: "OU", + doublesTier: "DOU", + }, + slowpoke: { + tier: "LC", + doublesTier: "LC", + }, + slowbro: { + tier: "OU", + doublesTier: "DOU", + }, + slowbromega: { + isNonstandard: "Past", + tier: "Illegal", + }, + magnemite: { + tier: "LC", + doublesTier: "LC", + }, + magneton: { + tier: "OU", + doublesTier: "DOU", + }, + farfetchd: { + tier: "OU", + doublesTier: "DOU", + }, + doduo: { + tier: "LC", + doublesTier: "LC", + }, + dodrio: { + tier: "OU", + doublesTier: "DOU", + }, + seel: { + tier: "LC", + doublesTier: "LC", + }, + dewgong: { + tier: "OU", + doublesTier: "DOU", + }, + grimer: { + tier: "LC", + doublesTier: "LC", + }, + muk: { + tier: "OU", + doublesTier: "DOU", + }, + shellder: { + tier: "LC", + doublesTier: "LC", + }, + cloyster: { + tier: "OU", + doublesTier: "DOU", + }, + gastly: { + tier: "LC", + doublesTier: "LC", + }, + haunter: { + tier: "NFE", + doublesTier: "NFE", + }, + gengar: { + tier: "OU", + doublesTier: "DOU", + }, + gengarmega: { + isNonstandard: "Past", + tier: "Illegal", + }, + onix: { + tier: "OU", + doublesTier: "DOU", + }, + drowzee: { + tier: "LC", + doublesTier: "LC", + }, + hypno: { + tier: "OU", + doublesTier: "DOU", + }, + krabby: { + tier: "LC", + doublesTier: "LC", + }, + kingler: { + tier: "OU", + doublesTier: "DOU", + }, + voltorb: { + tier: "LC", + doublesTier: "LC", + }, + electrode: { + tier: "OU", + doublesTier: "DOU", + }, + exeggcute: { + tier: "LC", + doublesTier: "LC", + }, + exeggutor: { + tier: "OU", + doublesTier: "DOU", + }, + cubone: { + tier: "LC", + doublesTier: "LC", + }, + marowak: { + tier: "OU", + doublesTier: "DOU", + }, + hitmonlee: { + tier: "OU", + doublesTier: "DOU", + }, + hitmonchan: { + tier: "OU", + doublesTier: "DOU", + }, + lickitung: { + tier: "LC", + doublesTier: "LC", + }, + koffing: { + tier: "LC", + doublesTier: "LC", + }, + weezing: { + tier: "OU", + doublesTier: "DOU", + }, + rhyhorn: { + tier: "LC", + doublesTier: "LC", + }, + rhydon: { + tier: "OU", + doublesTier: "DOU", + }, + chansey: { + tier: "OU", + doublesTier: "DOU", + }, + tangela: { + tier: "OU", + doublesTier: "DOU", + }, + kangaskhan: { + tier: "OU", + doublesTier: "DOU", + }, + kangaskhanmega: { + isNonstandard: "Past", + tier: "Illegal", + }, + horsea: { + tier: "LC", + doublesTier: "LC", + }, + seadra: { + tier: "OU", + doublesTier: "DOU", + }, + goldeen: { + tier: "LC", + doublesTier: "LC", + }, + seaking: { + tier: "OU", + doublesTier: "DOU", + }, + staryu: { + tier: "LC", + doublesTier: "LC", + }, + starmie: { + tier: "OU", + doublesTier: "DOU", + }, + mrmime: { + tier: "OU", + doublesTier: "DOU", + }, + scyther: { + tier: "OU", + doublesTier: "DOU", + }, + jynx: { + tier: "OU", + doublesTier: "DOU", + }, + electabuzz: { + tier: "OU", + doublesTier: "DOU", + }, + magmar: { + tier: "OU", + doublesTier: "DOU", + }, + pinsir: { + tier: "OU", + doublesTier: "DOU", + }, + pinsirmega: { + isNonstandard: "Past", + tier: "Illegal", + }, + tauros: { + tier: "OU", + doublesTier: "DOU", + }, + magikarp: { + tier: "LC", + doublesTier: "LC", + }, + gyarados: { + tier: "OU", + doublesTier: "DOU", + }, + gyaradosmega: { + isNonstandard: "Past", + tier: "Illegal", + }, + lapras: { + tier: "OU", + doublesTier: "DOU", + }, + ditto: { + tier: "OU", + doublesTier: "DOU", + }, + eevee: { + tier: "LC", + doublesTier: "LC", + }, + vaporeon: { + tier: "OU", + doublesTier: "DOU", + }, + jolteon: { + tier: "OU", + doublesTier: "DOU", + }, + flareon: { + tier: "OU", + doublesTier: "DOU", + }, + porygon: { + tier: "OU", + doublesTier: "DOU", + }, + omanyte: { + tier: "LC", + doublesTier: "LC", + }, + omastar: { + tier: "OU", + doublesTier: "DOU", + }, + kabuto: { + tier: "LC", + doublesTier: "LC", + }, + kabutops: { + tier: "OU", + doublesTier: "DOU", + }, + aerodactyl: { + tier: "OU", + doublesTier: "DOU", + }, + aerodactylmega: { + isNonstandard: "Past", + tier: "Illegal", + }, + snorlax: { + tier: "OU", + doublesTier: "DOU", + }, + articuno: { + tier: "OU", + doublesTier: "DOU", + }, + zapdos: { + tier: "OU", + doublesTier: "DOU", + }, + moltres: { + tier: "OU", + doublesTier: "DOU", + }, + dratini: { + tier: "LC", + doublesTier: "LC", + }, + dragonair: { + tier: "NFE", + doublesTier: "NFE", + }, + dragonite: { + tier: "OU", + doublesTier: "DOU", + }, + mewtwo: { + isNonstandard: "Past", + tier: "Illegal", + }, + mewtwomegax: { + isNonstandard: "Past", + tier: "Illegal", + }, + mewtwomegay: { + isNonstandard: "Past", + tier: "Illegal", + }, + mew: { + tier: "OU", + doublesTier: "DOU", + }, +}; diff --git a/data/mods/gen9regeneration/moves.ts b/data/mods/gen9regeneration/moves.ts new file mode 100644 index 0000000000..5c61416b6c --- /dev/null +++ b/data/mods/gen9regeneration/moves.ts @@ -0,0 +1,573 @@ +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { + // new + vitalenergy: { + accuracy: 100, + basePower: 150, + basePowerCallback(pokemon, target, move) { + return move.basePower * pokemon.hp / pokemon.maxhp; + }, + onPrepareHit(target, source, move) { + this.attrLastMove('[still]'); + this.add('-anim', source, "Seed Flare", target); + }, + category: "Special", + name: "Vital Energy", + shortDesc: "Less power as user's HP decreases. Hits foe(s).", + pp: 5, + priority: 0, + flags: { protect: 1, mirror: 1 }, + secondary: undefined, + target: "allAdjacentFoes", + type: "Grass", + contestType: "Beautiful", + }, + smokytorment: { + accuracy: true, + basePower: 75, + category: "Physical", + name: "Smoky Torment", + shortDesc: "Applies the Torment effect on opponent.", + pp: 10, + priority: 0, + flags: { protect: 1, mirror: 1, metronome: 1 }, + onPrepareHit(target, source, move) { + this.attrLastMove('[still]'); + this.add('-anim', source, "Outrage", target); + }, + secondary: { + chance: 100, + volatileStatus: 'torment', + }, + target: "normal", + type: "Dark", + contestType: "Cool", + }, + powerwash: { + accuracy: 100, + basePower: 50, + category: "Special", + name: "Power Wash", + shortDesc: "Removes all hazards in the field. If any are cleared, the user heals for 50% of its maximum HP.", + pp: 40, + priority: 0, + flags: { protect: 1, mirror: 1, metronome: 1 }, + onHit(target, source, move) { + let success = false; + const removeAll = [ + 'spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge', + ]; + for (const sideCondition of removeAll) { + if (source.side.removeSideCondition(sideCondition)) { + this.add('-sideend', source.side, this.dex.conditions.get(sideCondition).name, '[from] move: Power Wash', `[of] ${source}`); + success = true; + } + } + this.heal(Math.ceil(source.maxhp * 0.5), source); + return success; + }, + onPrepareHit(target, source, move) { + this.attrLastMove('[still]'); + this.add('-anim', source, "Volt Switch", target); + }, + target: "normal", + type: "Water", + contestType: "Cool", + }, + brainwave: { + accuracy: 100, + basePower: 70, + category: "Special", + name: "Brainwave", + shortDesc: "Uses user's Special Defense stat as Special Attack in damage calculation.", + pp: 10, + priority: 0, + flags: { protect: 1, mirror: 1, metronome: 1 }, + overrideOffensiveStat: 'spd', + onPrepareHit(target, source, move) { + this.attrLastMove('[still]'); + this.add('-anim', source, "Expanding Force", target); + }, + secondary: undefined, + target: "normal", + type: "Psychic", + }, + illwind: { + accuracy: 100, + basePower: 100, + category: "Special", + name: "Ill Wind", + shortDesc: "Lowers the user's Sp. Atk by 1, drains 25% damage, heals another 25% for each neg SpA boost.", + pp: 10, + priority: 0, + flags: { protect: 1, mirror: 1, heal: 1 }, + self: { + boosts: { + spa: -1, + }, + }, + drain: [1, 4], + /* onModifyMove(move, pokemon) { + move.drain = [pokemon.negativeBoosts.spa(), 4]; + }, */ + onPrepareHit(target, source, move) { + this.attrLastMove('[still]'); + this.add('-anim', source, "Icy Wind", target); + }, + secondary: undefined, + target: "normal", + type: "Ice", + contestType: "Clever", + }, + guardiandive: { + accuracy: 100, + basePower: 75, + category: "Physical", + name: "Guardian Dive", + shortDesc: "Uses user's Defense stat as Attack in damage calculation.", + pp: 10, + priority: 0, + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, + overrideOffensiveStat: 'def', + onPrepareHit(target, source, move) { + this.attrLastMove('[still]'); + this.add('-anim', source, "Acrobatics", target); + }, + secondary: undefined, + target: "normal", + type: "Flying", + }, + coralcrash: { + accuracy: 100, + basePower: 120, + category: "Physical", + name: "Coral Crash", + shortDesc: "33% recoil. 10% chance to poison.", + pp: 15, + priority: 0, + flags: { protect: 1, mirror: 1, metronome: 1 }, + secondary: { + chance: 10, + status: 'psn', + }, + onPrepareHit(target, source, move) { + this.attrLastMove('[still]'); + this.add('-anim', source, "Aqua Tail", target); + }, + recoil: [33, 100], + target: "normal", + type: "Poison", + contestType: "Tough", + }, + slipaway: { + accuracy: 100, + basePower: 50, + category: "Physical", + name: "Slip Away", + shortDesc: "100% chance to lower the target's Attack by 1, switches the user out.", + pp: 20, + priority: 0, + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, + secondary: { + chance: 100, + boosts: { + atk: -1, + }, + }, + onPrepareHit(target, source, move) { + this.attrLastMove('[still]'); + this.add('-anim', source, "Aqua Tail", target); + }, + selfSwitch: true, + target: "normal", + type: "Water", + zMove: { effect: 'healreplacement' }, + contestType: "Cool", + }, + flareout: { + accuracy: 100, + basePower: 70, + category: "Physical", + name: "Flare Out", + shortDesc: "100% chance to lower the target's Defense by 1, switches the user out.", + pp: 20, + priority: 0, + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, + secondary: { + chance: 100, + boosts: { + def: -1, + }, + }, + onPrepareHit(target, source, move) { + this.attrLastMove('[still]'); + this.add('-anim', source, "Flame Charge", target); + }, + selfSwitch: true, + target: "normal", + type: "Fire", + zMove: { effect: 'healreplacement' }, + contestType: "Cool", + }, + buzzoff: { + accuracy: 100, + basePower: 60, + category: "Special", + name: "Buzz Off", + shortDesc: "100% chance to lower the target's Speed by 1, switches the user out.", + pp: 20, + priority: 0, + flags: { protect: 1, mirror: 1, metronome: 1 }, + secondary: { + chance: 100, + boosts: { + spe: -1, + }, + }, + onPrepareHit(target, source, move) { + this.attrLastMove('[still]'); + this.add('-anim', source, "Volt Switch", target); + }, + selfSwitch: true, + target: "normal", + type: "Electric", + zMove: { effect: 'healreplacement' }, + contestType: "Cool", + }, + powdergale: { + accuracy: 100, + basePower: 75, + category: "Special", + name: "Powder Gale", + shortDesc: "100% chance to poison. Harshly lowers a random one of the target's stats.", + pp: 10, + priority: 0, + flags: { protect: 1, mirror: 1, wind: 1, metronome: 1 }, + onHit(target) { + const stats: BoostID[] = []; + let stat: BoostID; + for (stat in target.boosts) { + if (stat === 'accuracy' || stat === 'evasion') continue; + if (target.boosts[stat] > -6) { + stats.push(stat); + } + } + if (stats.length) { + const randomStat = this.sample(stats); + const boost: SparseBoostsTable = {}; + boost[randomStat] = -2; + this.boost(boost); + } else { + return; + } + }, + secondary: { + chance: 100, + status: 'psn', + }, + onPrepareHit(target, source, move) { + this.attrLastMove('[still]'); + this.add('-anim', source, "Silver Wind", target); + }, + target: "normal", + type: "Bug", + contestType: "Clever", + }, + splashback: { + accuracy: 100, + basePower: 50, + basePowerCallback(pokemon) { + return Math.min(300, 50 + 50 * pokemon.timesAttacked); + }, + /* onEnd(pokemon) { + this.add('-end', pokemon, 'Splashback', '[silent]'); + }, */ + onPrepareHit(target, source, move) { + this.attrLastMove('[still]'); + this.add('-anim', source, "Flip Turn", target); + }, + category: "Physical", + name: "Splashback", + shortDesc: "Base power increases by 50 every time this Pokemon is hit. Max 300 BP. Reset on switch out.", + pp: 10, + priority: 0, + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, + secondary: undefined, + target: "normal", + type: "Water", + }, + ragingtorrent: { + accuracy: 100, + basePower: 90, + category: "Physical", + name: "Raging Torrent", + shortDesc: "Lowers the target's Atk by 1. Inflicts Encore on the user.", + pp: 20, + priority: 0, + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, + self: { + volatileStatus: 'encore', + }, + secondary: { + chance: 100, + boosts: { + atk: -1, + }, + }, + onPrepareHit(target, source, move) { + this.attrLastMove('[still]'); + this.add('-anim', source, "Breaking Swipe", target); + }, + target: "allAdjacentFoes", + type: "Water", + contestType: "Tough", + }, + familyonslaught: { + accuracy: 100, + basePower: 40, + category: "Physical", + shortDesc: "Hits 2-4 times.", + name: "Family Onslaught", + pp: 10, + priority: 0, + flags: { protect: 1, mirror: 1, metronome: 1 }, + multihit: [2, 4], + onPrepareHit(target, source, move) { + this.attrLastMove('[still]'); + this.add('-anim', source, "Population Bomb", target); + }, + target: "normal", + type: "Normal", + contestType: "Cute", + }, + pestspread: { + accuracy: 100, + basePower: 100, + category: "Physical", + shortDesc: "Changes the target's type to the user's type.", + name: "Pest Spread", + pp: 10, + priority: 0, + flags: { protect: 1, mirror: 1, metronome: 1 }, + onAfterHit(target, source) { + if (target.species && (target.species.num === 493 || target.species.num === 773)) return false; + if (target.terastallized) return false; + const oldApparentType = target.apparentType; + let newBaseTypes = source.getTypes(true).filter(type => type !== '???'); + if (!newBaseTypes.length) { + if (source.addedType) { + newBaseTypes = ['Normal']; + } else { + return false; + } + } + this.add('-start', target, 'typechange', '[from] move: Pest Spread', `[of] ${target}`); + target.setType(newBaseTypes); + target.addedType = source.addedType; + target.knownType = source.isAlly(source) && source.knownType; + if (!target.knownType) target.apparentType = oldApparentType; + }, + onPrepareHit(target, source, move) { + this.attrLastMove('[still]'); + this.add('-anim', source, "Sludge Bomb", target); + }, + target: "normal", + type: "Poison", + }, + vengefulbone: { + accuracy: 100, + basePower: 80, + category: "Physical", + shortDesc: "Power doubles if an ally fainted last turn.", + name: "Vengeful Bone", + pp: 10, + priority: 0, + flags: { protect: 1, mirror: 1, metronome: 1 }, + onPrepareHit(target, source, move) { + this.attrLastMove('[still]'); + this.add('-anim', source, "Shadow Bone", target); + }, + onBasePower(basePower, pokemon) { + if (pokemon.side.faintedLastTurn) { + this.debug('Boosted for a faint last turn'); + return this.chainModify(2); + } + }, + target: "normal", + type: "Ghost", + contestType: "Cool", + }, + escort: { + accuracy: 100, + basePower: 50, + category: "Special", + shortDesc: "User switches out. Switch-in is immune to hazards.", + name: "Escort", + pp: 15, + priority: 0, + flags: { protect: 1, mirror: 1, metronome: 1 }, + selfSwitch: true, + onPrepareHit(target, source, move) { + this.attrLastMove('[still]'); + this.add('-anim', source, "Baton Pass", source); + }, + self: { + sideCondition: 'escort', + }, + condition: { + duration: 1, + }, + target: "normal", + type: "Normal", + contestType: "Clever", + }, + stealthrock: { + inherit: true, + condition: { + // this is a side condition + onSideStart(side) { + this.add('-sidestart', side, 'move: Stealth Rock'); + }, + onSwitchIn(pokemon) { + if (pokemon.hasItem('heavydutyboots') || pokemon.side.getSideCondition('escort')) return; + const typeMod = this.clampIntRange(pokemon.runEffectiveness(this.dex.getActiveMove('stealthrock')), -6, 6); + this.damage(pokemon.maxhp * (2 ** typeMod) / 8); + }, + }, + }, + gmaxsteelsurge: { + inherit: true, + condition: { + onSideStart(side) { + this.add('-sidestart', side, 'move: G-Max Steelsurge'); + }, + onSwitchIn(pokemon) { + if (pokemon.hasItem('heavydutyboots') || pokemon.side.getSideCondition('escort')) return; + // Ice Face and Disguise correctly get typed damage from Stealth Rock + // because Stealth Rock bypasses Substitute. + // They don't get typed damage from Steelsurge because Steelsurge doesn't, + // so we're going to test the damage of a Steel-type Stealth Rock instead. + const steelHazard = this.dex.getActiveMove('Stealth Rock'); + steelHazard.type = 'Steel'; + const typeMod = this.clampIntRange(pokemon.runEffectiveness(steelHazard), -6, 6); + this.damage(pokemon.maxhp * (2 ** typeMod) / 8); + }, + }, + }, + spikes: { + inherit: true, + condition: { + // this is a side condition + onSideStart(side) { + this.add('-sidestart', side, 'Spikes'); + this.effectState.layers = 1; + }, + onSideRestart(side) { + if (this.effectState.layers >= 3) return false; + this.add('-sidestart', side, 'Spikes'); + this.effectState.layers++; + }, + onSwitchIn(pokemon) { + if (!pokemon.isGrounded() || pokemon.hasItem('heavydutyboots') || pokemon.side.getSideCondition('escort')) return; + const damageAmounts = [0, 3, 4, 6]; // 1/8, 1/6, 1/4 + this.damage(damageAmounts[this.effectState.layers] * pokemon.maxhp / 24); + }, + }, + }, + stickyweb: { + inherit: true, + condition: { + onSideStart(side) { + this.add('-sidestart', side, 'move: Sticky Web'); + }, + onSwitchIn(pokemon) { + if (!pokemon.isGrounded() || pokemon.hasItem('heavydutyboots') || pokemon.side.getSideCondition('escort')) return; + this.add('-activate', pokemon, 'move: Sticky Web'); + this.boost({ spe: -1 }, pokemon, pokemon.side.foe.active[0], this.dex.getActiveMove('stickyweb')); + }, + }, + }, + toxicspikes: { + inherit: true, + condition: { + // this is a side condition + onSideStart(side) { + this.add('-sidestart', side, 'move: Toxic Spikes'); + this.effectState.layers = 1; + }, + onSideRestart(side) { + if (this.effectState.layers >= 2) return false; + this.add('-sidestart', side, 'move: Toxic Spikes'); + this.effectState.layers++; + }, + onSwitchIn(pokemon) { + if (!pokemon.isGrounded()) return; + if (pokemon.hasType('Poison')) { + this.add('-sideend', pokemon.side, 'move: Toxic Spikes', `[of] ${pokemon}`); + pokemon.side.removeSideCondition('toxicspikes'); + } else if (pokemon.hasType('Steel') || pokemon.hasItem('heavydutyboots') || pokemon.side.getSideCondition('escort')) { + // do nothing + } else if (this.effectState.layers >= 2) { + pokemon.trySetStatus('tox', pokemon.side.foe.active[0]); + } else { + pokemon.trySetStatus('psn', pokemon.side.foe.active[0]); + } + }, + }, + }, + /* // leftover placeholder for hidden power because teams.ts was not cooperating previously + terablast: { + num: 851, + accuracy: 100, + basePower: 60, + category: "Special", + name: "Tera Blast", + pp: 15, + priority: 0, + flags: { protect: 1, mirror: 1, metronome: 1, mustpressure: 1 }, + onPrepareHit(target, source, move) { + this.attrLastMove('[anim] Tera Blast ' + source.teraType); + }, + onModifyType(move, pokemon, target) { + move.type = pokemon.teraType; + this.add('-message', `This attack is ${pokemon.teraType}-type!`); + }, + target: "normal", + type: "Normal", + }, */ + magicroom: { + inherit: true, + condition: { + duration: 5, + durationCallback(source, effect) { + if (source?.hasAbility('blackout')) { + this.add('-activate', source, 'ability: blackout', '[move] Magic Room'); + return 0; + } + if (source?.hasAbility('persistent')) { + this.add('-activate', source, 'ability: Persistent', '[move] Magic Room'); + return 7; + } + return 5; + }, + onFieldStart(target, source) { + if (source?.hasAbility('persistent')) { + this.add('-fieldstart', 'move: Magic Room', `[of] ${source}`, '[persistent]'); + } else { + this.add('-fieldstart', 'move: Magic Room', `[of] ${source}`); + } + for (const mon of this.getAllActive()) { + this.singleEvent('End', mon.getItem(), mon.itemState, mon); + } + }, + onFieldRestart(target, source) { + this.field.removePseudoWeather('magicroom'); + }, + // Item suppression implemented in Pokemon.ignoringItem() within sim/pokemon.js + onFieldResidualOrder: 27, + onFieldResidualSubOrder: 6, + onFieldEnd() { + this.add('-fieldend', 'move: Magic Room', '[of] ' + this.effectState.source); + }, + }, + }, +}; diff --git a/data/mods/gen9regeneration/pokedex.ts b/data/mods/gen9regeneration/pokedex.ts new file mode 100644 index 0000000000..b6ec63046e --- /dev/null +++ b/data/mods/gen9regeneration/pokedex.ts @@ -0,0 +1,198 @@ +export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { + // new + alakazam: { + inherit: true, + baseStats: { hp: 80, atk: 50, def: 50, spa: 110, spd: 110, spe: 110 }, + abilities: { 0: "Galaxy Brain", 1: "Inner Focus", H: "Trace" }, + }, + gengar: { + inherit: true, + types: ["Ghost", "Ice"], + baseStats: { hp: 65, atk: 65, def: 65, spa: 100, spd: 90, spe: 115 }, + abilities: { 0: "Blackout" }, + }, + dragonite: { + inherit: true, + baseStats: { hp: 91, atk: 134, def: 95, spa: 95, spd: 84, spe: 101 }, + abilities: { 0: "Lifeguard", H: "Marvel Scale" }, + }, + venusaur: { + inherit: true, + types: ["Grass", "Fairy"], + baseStats: { hp: 80, atk: 66, def: 98, spa: 111, spd: 100, spe: 70 }, + abilities: { 0: "Overgrow", H: "Misty Surge" }, + }, + charizard: { + inherit: true, + types: ["Fire", "Dark"], + baseStats: { hp: 68, atk: 120, def: 89, spa: 60, spd: 87, spe: 109 }, + abilities: { 0: "Blaze", H: "Levitate" }, + }, + blastoise: { + inherit: true, + types: ["Water", "Electric"], + baseStats: { hp: 79, atk: 53, def: 100, spa: 105, spd: 105, spe: 88 }, + abilities: { 0: "Torrent", H: "Motor Drive" }, + }, + beedrill: { + inherit: true, + baseStats: { hp: 65, atk: 100, def: 40, spa: 35, spd: 94, spe: 116 }, + abilities: { 0: "Poison Touch", H: "Speed Boost" }, + }, + pidgeot: { + inherit: true, + types: ["Flying"], + baseStats: { hp: 83, atk: 100, def: 75, spa: 50, spd: 70, spe: 112 }, + abilities: { 0: "Keen Eye", 1: "Tangled Feet", H: "Wings of Victory" }, + }, + onix: { + inherit: true, + evos: [], + baseStats: { hp: 75, atk: 135, def: 140, spa: 30, spd: 75, spe: 70 }, + abilities: { 0: "Sturdy", 1: "Solid Rock", H: "Excavate" }, + }, + wigglytuff: { + inherit: true, + types: ["Fairy", "Dark"], + baseStats: { hp: 140, atk: 75, def: 50, spa: 65, spd: 45, spe: 121 }, + abilities: { 0: "Cute Charm", 1: "Aftermath", H: "Ballooning" }, + }, + dodrio: { + inherit: true, + types: ["Ground", "Fighting"], + baseStats: { hp: 85, atk: 115, def: 60, spa: 55, spd: 55, spe: 115 }, + abilities: { 0: "Sand Rush", 1: "Early Bird", H: "Of A Feather" }, + }, + seadra: { + inherit: true, + evos: [], + types: ["Poison", "Dragon"], + baseStats: { hp: 80, atk: 100, def: 95, spa: 100, spd: 70, spe: 85 }, + abilities: { 0: "Poison Point", 1: "Rain Dish", H: "Merciless" }, + }, + vaporeon: { + inherit: true, + abilities: { 0: "Run Away", 1: "Trace", H: "Protean" }, + }, + flareon: { + inherit: true, + baseStats: { hp: 110, atk: 130, def: 60, spa: 65, spd: 65, spe: 95 }, + abilities: { 0: "Run Away", 1: "Trace", H: "Protean" }, + }, + jolteon: { + inherit: true, + baseStats: { hp: 65, atk: 65, def: 60, spa: 95, spd: 110, spe: 130 }, + abilities: { 0: "Run Away", 1: "Trace", H: "Protean" }, + }, + nidoking: { + inherit: true, + baseStats: { hp: 81, atk: 102, def: 82, spa: 95, spd: 70, spe: 95 }, + abilities: { 0: "Poison Point", 1: "Patriarch", H: "Sheer Force" }, + }, + nidoqueen: { + inherit: true, + baseStats: { hp: 100, atk: 82, def: 87, spa: 95, spd: 85, spe: 76 }, + abilities: { 0: "Poison Point", 1: "Natural Cure", H: "Sheer Force" }, + }, + butterfree: { + inherit: true, + baseStats: { hp: 80, atk: 45, def: 52, spa: 92, spd: 79, spe: 106 }, + abilities: { 0: "Compound Eyes", 1: "Tinted Lens", H: "Multiscale" }, + }, + cloyster: { + inherit: true, + types: ["Water", "Steel"], + baseStats: { hp: 80, atk: 90, def: 165, spa: 80, spd: 70, spe: 50 }, + abilities: { 0: "Shell Armor", 1: "Water Veil", H: "Regenerator" }, + }, + gyarados: { + inherit: true, + baseStats: { hp: 100, atk: 100, def: 107, spa: 70, spd: 92, spe: 71 }, + abilities: { 0: "Violent Abandon" }, + }, + gyaradosmega: { + inherit: true, + baseStats: { hp: 100, atk: 125, def: 107, spa: 105, spd: 122, spe: 81 }, + abilities: { 0: "Violent Abandon" }, + requiredItem: "", + }, + tentacruel: { + inherit: true, + types: ["Dark", "Poison"], + baseStats: { hp: 80, atk: 50, def: 65, spa: 100, spd: 120, spe: 100 }, + abilities: { 0: "Tropical Current" }, + }, + raticate: { + inherit: true, + types: ["Normal", "Poison"], + baseStats: { hp: 75, atk: 90, def: 70, spa: 40, spd: 75, spe: 125 }, + abilities: { 0: "Poison Touch", 1: "Hustle", H: "Guts" }, + }, + kangaskhan: { + inherit: true, + types: ["Normal", "Dragon"], + baseStats: { hp: 115, atk: 110, def: 70, spa: 60, spd: 60, spe: 85 }, + abilities: { 0: "Early Bird", 1: "Bulletproof", H: "Skill Link" }, + }, + farfetchd: { + inherit: true, + types: ["Normal", "Fighting"], + baseStats: { hp: 75, atk: 100, def: 80, spa: 60, spd: 75, spe: 90 }, + abilities: { 0: "Hustle", 1: "Scrappy", H: "Defiant" }, + }, + lapras: { + inherit: true, + types: ["Ice", "Water"], + baseStats: { hp: 130, atk: 85, def: 80, spa: 85, spd: 95, spe: 60 }, + abilities: { 0: "Storm Drain", 1: "Shell Armor", H: "Hydration" }, + }, + tauros: { + inherit: true, + types: ["Normal", "Ground"], + baseStats: { hp: 85, atk: 110, def: 105, spa: 30, spd: 70, spe: 110 }, + abilities: { 0: "Intimidate", 1: "Bull Spirit", H: "Sheer Force" }, + }, + marowak: { + inherit: true, + types: ["Ground", "Ghost"], + baseStats: { hp: 80, atk: 80, def: 105, spa: 50, spd: 95, spe: 100 }, + abilities: { 0: "Battle Armor", 1: "Sand Force", H: "Justified" }, + }, + // Minor Changes (mostly to prevent unevolved Pokemons in gen 1 to hold Eviolite) + golbat: { + inherit: true, + evos: [], + }, + magneton: { + inherit: true, + evos: [], + }, + lickitung: { + inherit: true, + evos: [], + }, + rhydon: { + inherit: true, + evos: [], + }, + chansey: { + inherit: true, + evos: [], + }, + tangela: { + inherit: true, + evos: [], + }, + electabuzz: { + inherit: true, + evos: [], + }, + magmar: { + inherit: true, + evos: [], + }, + porygon: { + inherit: true, + evos: [], + }, +}; diff --git a/data/mods/gen9regeneration/scripts.ts b/data/mods/gen9regeneration/scripts.ts new file mode 100644 index 0000000000..d3c1d6f7dc --- /dev/null +++ b/data/mods/gen9regeneration/scripts.ts @@ -0,0 +1,333 @@ +export const Scripts: ModdedBattleScriptsData = { + gen: 9, + actions: { + modifyDamage( + baseDamage: number, pokemon: Pokemon, target: Pokemon, move: ActiveMove, suppressMessages = false + ) { + const tr = this.battle.trunc; + if (!move.type) move.type = '???'; + const type = move.type; + + baseDamage += 2; + + if (move.spreadHit) { + // multi-target modifier (doubles only) + const spreadModifier = this.battle.gameType === 'freeforall' ? 0.5 : 0.75; + this.battle.debug(`Spread modifier: ${spreadModifier}`); + baseDamage = this.battle.modify(baseDamage, spreadModifier); + } else if (move.multihitType === 'parentalbond' && move.hit > 1) { + // Parental Bond modifier + const bondModifier = this.battle.gen > 6 ? 0.25 : 0.5; + this.battle.debug(`Parental Bond modifier: ${bondModifier}`); + baseDamage = this.battle.modify(baseDamage, bondModifier); + } + + // weather modifier + baseDamage = this.battle.runEvent('WeatherModifyDamage', pokemon, target, move, baseDamage); + + // crit - not a modifier + const isCrit = target.getMoveHitData(move).crit; + if (isCrit) { + baseDamage = tr(baseDamage * (move.critModifier || (this.battle.gen >= 6 ? 1.5 : 2))); + } + + // random factor - also not a modifier + baseDamage = this.battle.randomizer(baseDamage); + + // STAB + // The "???" type never gets STAB + // Not even if you Roost in Gen 4 and somehow manage to use + // Struggle in the same turn. + // (On second thought, it might be easier to get a MissingNo.) + if (type !== '???') { + let stab: number | [number, number] = 1; + + const isSTAB = move.forceSTAB || pokemon.hasType(type) || pokemon.getTypes(false, true).includes(type); + if (isSTAB) { + stab = 1.5; + } + + // The Stellar tera type makes this incredibly confusing + // If the move's type does not match one of the user's base types, + // the Stellar tera type applies a one-time 1.2x damage boost for that type. + // + // If the move's type does match one of the user's base types, + // then the Stellar tera type applies a one-time 2x STAB boost for that type, + // and then goes back to using the regular 1.5x STAB boost for those types. + if (pokemon.terastallized === 'Stellar') { + if (!pokemon.stellarBoostedTypes.includes(type) || move.stellarBoosted) { + stab = isSTAB ? 2 : [4915, 4096]; + move.stellarBoosted = true; + if (pokemon.species.name !== 'Terapagos-Stellar') { + pokemon.stellarBoostedTypes.push(type); + } + } + } else { + if (pokemon.terastallized === type && pokemon.getTypes(false, true).includes(type)) { + stab = 2; + } + stab = this.battle.runEvent('ModifySTAB', pokemon, target, move, stab); + } + + baseDamage = this.battle.modify(baseDamage, stab); + } + + // types + let typeMod = target.runEffectiveness(move); + typeMod = this.battle.clampIntRange(typeMod, -6, 6); + target.getMoveHitData(move).typeMod = typeMod; + if (typeMod > 0) { + if (!suppressMessages) this.battle.add('-supereffective', target); + + for (let i = 0; i < typeMod; i++) { + baseDamage *= 2; + } + } + if (typeMod < 0) { + if (!suppressMessages) this.battle.add('-resisted', target); + + for (let i = 0; i > typeMod; i--) { + baseDamage = tr(baseDamage / 2); + } + } + + if (isCrit && !suppressMessages) this.battle.add('-crit', target); + + if ( + pokemon.status === 'brn' && move.category === 'Physical' && + !pokemon.hasAbility('guts') && !pokemon.hasAbility('tropicalcurrent') + ) { + if (this.battle.gen < 6 || move.id !== 'facade') { + baseDamage = this.battle.modify(baseDamage, 0.5); + } + } + + // Generation 5, but nothing later, sets damage to 1 before the final damage modifiers + if (this.battle.gen === 5 && !baseDamage) baseDamage = 1; + + // Final modifier. Modifiers that modify damage after min damage check, such as Life Orb. + baseDamage = this.battle.runEvent('ModifyDamage', pokemon, target, move, baseDamage); + + const bypassProtect = target.getMoveHitData(move).bypassProtect; + if (bypassProtect) { + baseDamage = this.battle.modify(baseDamage, 0.25); + if (bypassProtect !== true && bypassProtect.effectType === 'Ability') { + this.battle.add('-ability', pokemon, bypassProtect.name); + } + this.battle.add('-zbroken', target); + } + + // Generation 6-7 moves the check for minimum 1 damage after the final modifier... + if (this.battle.gen !== 5 && !baseDamage) return 1; + + // ...but 16-bit truncation happens even later, and can truncate to 0 + return tr(baseDamage, 16); + }, + }, + init() { + this.modData("Learnsets", "alakazam").learnset.brainwave = ["9L1"]; + this.modData("Learnsets", "gengar").learnset.avalanche = ["9L1"]; + this.modData("Learnsets", "gengar").learnset.blizzard = ["9L1"]; + this.modData("Learnsets", "gengar").learnset.focusenergy = ["9L1"]; + this.modData("Learnsets", "gengar").learnset.frostbreath = ["9L1"]; + this.modData("Learnsets", "gengar").learnset.icebeam = ["9L1"]; + this.modData("Learnsets", "gengar").learnset.iceshard = ["9L1"]; + this.modData("Learnsets", "gengar").learnset.powdersnow = ["9L1"]; + this.modData("Learnsets", "gengar").learnset.snowscape = ["9L1"]; + this.modData("Learnsets", "gengar").learnset.illwind = ["9L1"]; + this.modData("Learnsets", "dragonite").learnset.barrier = ["9L1"]; + this.modData("Learnsets", "dragonite").learnset.guardiandive = ["9L1"]; + this.modData("Learnsets", "dragonite").learnset.uturn = ["9L1"]; + this.modData("Learnsets", "venusaur").learnset.aromaticmist = ["9L1"]; + this.modData("Learnsets", "venusaur").learnset.calmmind = ["9L1"]; + this.modData("Learnsets", "venusaur").learnset.dazzlinggleam = ["9L1"]; + this.modData("Learnsets", "venusaur").learnset.drainingkiss = ["9L1"]; + this.modData("Learnsets", "venusaur").learnset.fairywind = ["9L1"]; + this.modData("Learnsets", "venusaur").learnset.floralhealing = ["9L1"]; + this.modData("Learnsets", "venusaur").learnset.flowershield = ["9L1"]; + this.modData("Learnsets", "venusaur").learnset.healpulse = ["9L1"]; + this.modData("Learnsets", "venusaur").learnset.playrough = ["9L1"]; + this.modData("Learnsets", "venusaur").learnset.psychic = ["9L1"]; + this.modData("Learnsets", "venusaur").learnset.vitalenergy = ["9L1"]; + this.modData("Learnsets", "venusaur").learnset.zenheadbutt = ["9L1"]; + this.modData("Learnsets", "charizard").learnset.ceaselessedge = ["9L1"]; + this.modData("Learnsets", "charizard").learnset.throatchop = ["9L1"]; + this.modData("Learnsets", "charizard").learnset.smokytorment = ["9L1"]; + this.modData("Learnsets", "charizard").learnset.suckerpunch = ["9L1"]; + this.modData("Learnsets", "blastoise").learnset.chargebeam = ["9L1"]; + this.modData("Learnsets", "blastoise").learnset.charge = ["9L1"]; + this.modData("Learnsets", "blastoise").learnset.iondeluge = ["9L1"]; + this.modData("Learnsets", "blastoise").learnset.powerwash = ["9L1"]; + this.modData("Learnsets", "blastoise").learnset.thunder = ["9L1"]; + this.modData("Learnsets", "blastoise").learnset.thunderwave = ["9L1"]; + this.modData("Learnsets", "blastoise").learnset.thunderbolt = ["9L1"]; + this.modData("Learnsets", "blastoise").learnset.thundershock = ["9L1"]; + this.modData("Learnsets", "blastoise").learnset.voltswitch = ["9L1"]; + this.modData("Learnsets", "blastoise").learnset.zapcannon = ["9L1"]; + this.modData("Learnsets", "beedrill").learnset.closecombat = ["9L1"]; + this.modData("Learnsets", "beedrill").learnset.flail = ["9L1"]; + this.modData("Learnsets", "beedrill").learnset.reversal = ["9L1"]; + this.modData("Learnsets", "beedrill").learnset.spikes = ["9L1"]; + this.modData("Learnsets", "beedrill").learnset.stickyweb = ["9L1"]; + this.modData("Learnsets", "beedrill").learnset.taunt = ["9L1"]; + this.modData("Learnsets", "beedrill").learnset.terablast = ["9L1"]; + this.modData("Learnsets", "pidgeot").learnset.acrobatics = ["9L1"]; + this.modData("Learnsets", "pidgeot").learnset.closecombat = ["9L1"]; + this.modData("Learnsets", "wigglytuff").learnset.crunch = ["9L1"]; + this.modData("Learnsets", "wigglytuff").learnset.darkpulse = ["9L1"]; + this.modData("Learnsets", "wigglytuff").learnset.rapidspin = ["9L1"]; + this.modData("Learnsets", "wigglytuff").learnset.taunt = ["9L1"]; + this.modData("Learnsets", "wigglytuff").learnset.uturn = ["9L1"]; + this.modData("Learnsets", "dodrio").learnset.brickbreak = ["9L1"]; + this.modData("Learnsets", "dodrio").learnset.bulldoze = ["9L1"]; + this.modData("Learnsets", "dodrio").learnset.dig = ["9L1"]; + this.modData("Learnsets", "dodrio").learnset.drillrun = ["9L1"]; + this.modData("Learnsets", "dodrio").learnset.earthquake = ["9L1"]; + this.modData("Learnsets", "dodrio").learnset.highjumpkick = ["9L1"]; + this.modData("Learnsets", "dodrio").learnset.lowkick = ["9L1"]; + this.modData("Learnsets", "dodrio").learnset.quickguard = ["9L1"]; + this.modData("Learnsets", "dodrio").learnset.rototiller = ["9L1"]; + this.modData("Learnsets", "dodrio").learnset.sandattack = ["9L1"]; + this.modData("Learnsets", "dodrio").learnset.triplekick = ["9L1"]; + this.modData("Learnsets", "seadra").learnset.acidspray = ["9L1"]; + this.modData("Learnsets", "seadra").learnset.coralcrash = ["9L1"]; + this.modData("Learnsets", "seadra").learnset.dracometeor = ["9L1"]; + this.modData("Learnsets", "seadra").learnset.sludgebomb = ["9L1"]; + this.modData("Learnsets", "seadra").learnset.sludgewave = ["9L1"]; + this.modData("Learnsets", "seadra").learnset.thunder = ["9L1"]; + this.modData("Learnsets", "seadra").learnset.thunderbolt = ["9L1"]; + this.modData("Learnsets", "seadra").learnset.toxicspikes = ["9L1"]; + this.modData("Learnsets", "vaporeon").learnset.slipaway = ["9L1"]; + this.modData("Learnsets", "flareon").learnset.crunch = ["9L1"]; + this.modData("Learnsets", "flareon").learnset.flareout = ["9L1"]; + this.modData("Learnsets", "flareon").learnset.playrough = ["9L1"]; + this.modData("Learnsets", "flareon").learnset.psychicfangs = ["9L1"]; + this.modData("Learnsets", "flareon").learnset.suckerpunch = ["9L1"]; + this.modData("Learnsets", "jolteon").learnset.buzzoff = ["9L1"]; + this.modData("Learnsets", "nidoking").learnset.barbbarrage = ["9L1"]; + this.modData("Learnsets", "nidoqueen").learnset.moonlight = ["9L1"]; + this.modData("Learnsets", "butterfree").learnset.strengthsap = ["9L1"]; + this.modData("Learnsets", "butterfree").learnset.powdergale = ["9L1"]; + delete this.modData('Learnsets', 'alakazam').learnset.focusblast; + delete this.modData('Learnsets', 'alakazam').learnset.nastyplot; + delete this.modData('Learnsets', 'gengar').learnset.focusblast; + delete this.modData('Learnsets', 'gengar').learnset.nastyplot; + delete this.modData('Learnsets', 'gengar').learnset.terablast; + delete this.modData('Learnsets', 'gengar').learnset.thunderbolt; + delete this.modData('Learnsets', 'gengar').learnset.thunder; + delete this.modData('Learnsets', 'dragonite').learnset.dragonclaw; + delete this.modData('Learnsets', 'dragonite').learnset.dragondance; + delete this.modData('Learnsets', 'dragonite').learnset.dragonrush; + delete this.modData('Learnsets', 'dragonite').learnset.dualwingbeat; + delete this.modData('Learnsets', 'dragonite').learnset.honeclaws; + delete this.modData('Learnsets', 'dragonite').learnset.outrage; + delete this.modData('Learnsets', 'dragonite').learnset.poweruppunch; + delete this.modData('Learnsets', 'dragonite').learnset.terablast; + delete this.modData('Learnsets', 'venusaur').learnset.earthpower; + delete this.modData('Learnsets', 'venusaur').learnset.weatherball; + delete this.modData('Learnsets', 'blastoise').learnset.aurasphere; + delete this.modData('Learnsets', 'blastoise').learnset.avalanche; + delete this.modData('Learnsets', 'blastoise').learnset.blizzard; + delete this.modData('Learnsets', 'blastoise').learnset.focusblast; + delete this.modData('Learnsets', 'blastoise').learnset.hail; + delete this.modData('Learnsets', 'blastoise').learnset.icebeam; + delete this.modData('Learnsets', 'blastoise').learnset.icepunch; + delete this.modData('Learnsets', 'blastoise').learnset.icywind; + delete this.modData('Learnsets', 'blastoise').learnset.mist; + delete this.modData('Learnsets', 'blastoise').learnset.shellsmash; + delete this.modData('Learnsets', 'pidgeot').learnset.toxic; + delete this.modData('Learnsets', 'dodrio').learnset.fly; + delete this.modData('Learnsets', 'seadra').learnset.blizzard; + delete this.modData('Learnsets', 'seadra').learnset.icebeam; + // Removing the prevos' moves + delete this.modData('Learnsets', 'gastly').learnset.nastyplot; + delete this.modData('Learnsets', 'gastly').learnset.terablast; + delete this.modData('Learnsets', 'gastly').learnset.thunderbolt; + delete this.modData('Learnsets', 'gastly').learnset.thunder; + delete this.modData('Learnsets', 'haunter').learnset.focusblast; + delete this.modData('Learnsets', 'haunter').learnset.nastyplot; + delete this.modData('Learnsets', 'haunter').learnset.terablast; + delete this.modData('Learnsets', 'haunter').learnset.thunderbolt; + delete this.modData('Learnsets', 'haunter').learnset.thunder; + delete this.modData('Learnsets', 'dratini').learnset.dragondance; + delete this.modData('Learnsets', 'dratini').learnset.dragonrush; + delete this.modData('Learnsets', 'dratini').learnset.outrage; + delete this.modData('Learnsets', 'dratini').learnset.terablast; + delete this.modData('Learnsets', 'dragonair').learnset.dragondance; + delete this.modData('Learnsets', 'dragonair').learnset.dragonrush; + delete this.modData('Learnsets', 'dragonair').learnset.outrage; + delete this.modData('Learnsets', 'dragonair').learnset.terablast; + delete this.modData('Learnsets', 'bulbasaur').learnset.weatherball; + delete this.modData('Learnsets', 'ivysaur').learnset.weatherball; + delete this.modData('Learnsets', 'squirtle').learnset.aurasphere; + delete this.modData('Learnsets', 'squirtle').learnset.blizzard; + delete this.modData('Learnsets', 'squirtle').learnset.hail; + delete this.modData('Learnsets', 'squirtle').learnset.icebeam; + delete this.modData('Learnsets', 'squirtle').learnset.icepunch; + delete this.modData('Learnsets', 'squirtle').learnset.mist; + delete this.modData('Learnsets', 'squirtle').learnset.shellsmash; + delete this.modData('Learnsets', 'wartortle').learnset.aurasphere; + delete this.modData('Learnsets', 'wartortle').learnset.blizzard; + delete this.modData('Learnsets', 'wartortle').learnset.hail; + delete this.modData('Learnsets', 'wartortle').learnset.icebeam; + delete this.modData('Learnsets', 'wartortle').learnset.icepunch; + delete this.modData('Learnsets', 'wartortle').learnset.mist; + delete this.modData('Learnsets', 'wartortle').learnset.shellsmash; + delete this.modData('Learnsets', 'pidgey').learnset.toxic; + delete this.modData('Learnsets', 'pidgeotto').learnset.toxic; + delete this.modData('Learnsets', 'doduo').learnset.fly; + delete this.modData('Learnsets', 'horsea').learnset.blizzard; + delete this.modData('Learnsets', 'horsea').learnset.icebeam; + this.modData("Learnsets", "raticate").learnset.gunkshot = ["9L1"]; + this.modData("Learnsets", "raticate").learnset.poisonjab = ["9L1"]; + this.modData("Learnsets", "raticate").learnset.sludgebomb = ["9L1"]; + this.modData("Learnsets", "raticate").learnset.sludgewave = ["9L1"]; + this.modData("Learnsets", "raticate").learnset.sludge = ["9L1"]; + this.modData("Learnsets", "raticate").learnset.closecombat = ["9L1"]; + this.modData("Learnsets", "raticate").learnset.pestspread = ["9L1"]; + delete this.modData('Learnsets', 'raticate').learnset.swordsdance; + delete this.modData('Learnsets', 'raticate').learnset.stompingtantrum; + delete this.modData('Learnsets', 'raticate').learnset.suckerpunch; + delete this.modData('Learnsets', 'raticate').learnset.pursuit; + delete this.modData('Learnsets', 'raticate').learnset.zenheadbutt; + delete this.modData('Learnsets', 'rattata').learnset.swordsdance; + delete this.modData('Learnsets', 'rattata').learnset.stompingtantrum; + delete this.modData('Learnsets', 'rattata').learnset.suckerpunch; + delete this.modData('Learnsets', 'rattata').learnset.pursuit; + delete this.modData('Learnsets', 'rattata').learnset.zenheadbutt; + this.modData("Learnsets", "kangaskhan").learnset.familyonslaught = ["9L1"]; + this.modData("Learnsets", "kangaskhan").learnset.dragontail = ["9L1"]; + this.modData("Learnsets", "kangaskhan").learnset.dragonclaw = ["9L1"]; + this.modData("Learnsets", "kangaskhan").learnset.dracometeor = ["9L1"]; + this.modData("Learnsets", "kangaskhan").learnset.dragondance = ["9L1"]; + this.modData("Learnsets", "kangaskhan").learnset.uturn = ["9L1"]; + this.modData("Learnsets", "farfetchd").learnset.bulkup = ["9L1"]; + this.modData("Learnsets", "farfetchd").learnset.sacredsword = ["9L1"]; + delete this.modData('Learnsets', 'farfetchd').learnset.toxic; + this.modData("Learnsets", "lapras").learnset.escort = ["9L1"]; + this.modData("Learnsets", "lapras").learnset.wish = ["9L1"]; + this.modData("Learnsets", "tauros").learnset.escort = ["9L1"]; + this.modData("Learnsets", "tauros").learnset.headlongrush = ["9L1"]; + this.modData("Learnsets", "marowak").learnset.knockoff = ["9L1"]; + this.modData("Learnsets", "marowak").learnset.vengefulbone = ["9L1"]; + this.modData("Learnsets", "marowak").learnset.closecombat = ["9L1"]; + this.modData("Learnsets", "gyarados").learnset.acrobatics = ["9L1"]; + this.modData("Learnsets", "gyarados").learnset.ragingtorrent = ["9L1"]; + this.modData("Learnsets", "cloyster").learnset.bulletpunch = ["9L1"]; + this.modData("Learnsets", "cloyster").learnset.curse = ["9L1"]; + this.modData("Learnsets", "cloyster").learnset.explosion = ["9L1"]; + this.modData("Learnsets", "cloyster").learnset.ironhead = ["9L1"]; + this.modData("Learnsets", "cloyster").learnset.splashback = ["9L1"]; + this.modData("Learnsets", "tentacruel").learnset.darkpulse = ["9L1"]; + this.modData("Learnsets", "tentacruel").learnset.foulplay = ["9L1"]; + this.modData("Learnsets", "tentacruel").learnset.nastyplot = ["9L1"]; + delete this.modData('Learnsets', 'cloyster').learnset.iceshard; + delete this.modData('Learnsets', 'cloyster').learnset.lifedew; + delete this.modData('Learnsets', 'cloyster').learnset.shellsmash; + delete this.modData('Learnsets', 'tentacruel').learnset.scald; + delete this.modData('Learnsets', 'shellder').learnset.iceshard; + delete this.modData('Learnsets', 'shellder').learnset.lifedew; + delete this.modData('Learnsets', 'shellder').learnset.shellsmash; + delete this.modData('Learnsets', 'tentacool').learnset.scald; + }, +}; diff --git a/data/mods/gen9ssb/abilities.ts b/data/mods/gen9ssb/abilities.ts index 5776045a74..10afe20079 100644 --- a/data/mods/gen9ssb/abilities.ts +++ b/data/mods/gen9ssb/abilities.ts @@ -942,11 +942,12 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa this.boost({ spe: 1 }); this.heal(pokemon.maxhp); const move = this.dex.moves.get('finalgambit'); + const pp = this.calculatePP(move); const finalGambit = { move: move.name, id: move.id, - pp: move.noPPBoosts ? move.pp : move.pp * 8 / 5, - maxpp: move.noPPBoosts ? move.pp : move.pp * 8 / 5, + pp, + maxpp: pp, target: move.target, disabled: false, used: false, diff --git a/data/mods/gen9ssb/conditions.ts b/data/mods/gen9ssb/conditions.ts index 7a6f4cc3ce..dd7eb99318 100644 --- a/data/mods/gen9ssb/conditions.ts +++ b/data/mods/gen9ssb/conditions.ts @@ -3,6 +3,66 @@ import { changeSet, getName, enemyStaff } from './scripts'; import type { ModdedConditionData } from "../../../sim/dex-conditions"; export const Conditions: { [id: IDEntry]: ModdedConditionData & { innateName?: string } } = { + zacian: { + inherit: true, + onBattleStart(pokemon) { + if (pokemon.item !== 'rustedsword') return; + const rawSpecies = this.dex.species.get('Zacian-Crowned'); + const species = pokemon.setSpecies(rawSpecies); + if (!species) return; + pokemon.baseSpecies = rawSpecies; + pokemon.details = pokemon.getUpdatedDetails(); + // pokemon.setAbility(species.abilities['0'], null, null, true); + // pokemon.baseAbility = pokemon.ability; + + const ironHeadIndex = pokemon.baseMoves.indexOf('ironhead'); + if (ironHeadIndex >= 0) { + const move = this.dex.moves.get('behemothblade'); + const pp = this.calculatePP(move, pokemon.ppUps[ironHeadIndex]); + pokemon.baseMoveSlots[ironHeadIndex] = { + move: move.name, + id: move.id, + pp, + maxpp: pp, + target: move.target, + disabled: false, + disabledSource: '', + used: false, + }; + pokemon.moveSlots = pokemon.baseMoveSlots.slice(); + } + }, + }, + zamazenta: { + inherit: true, + onBattleStart(pokemon) { + if (pokemon.item !== 'rustedshield') return; + const rawSpecies = this.dex.species.get('Zamazenta-Crowned'); + const species = pokemon.setSpecies(rawSpecies); + if (!species) return; + pokemon.baseSpecies = rawSpecies; + pokemon.details = pokemon.getUpdatedDetails(); + // pokemon.setAbility(species.abilities['0'], null, null, true); + // pokemon.baseAbility = pokemon.ability; + + const ironHeadIndex = pokemon.baseMoves.indexOf('ironhead'); + if (ironHeadIndex >= 0) { + const move = this.dex.moves.get('behemothbash'); + const pp = this.calculatePP(move, pokemon.ppUps[ironHeadIndex]); + pokemon.baseMoveSlots[ironHeadIndex] = { + move: move.name, + id: move.id, + pp, + maxpp: pp, + target: move.target, + disabled: false, + disabledSource: '', + used: false, + }; + pokemon.moveSlots = pokemon.baseMoveSlots.slice(); + } + }, + }, /* // Example: userid: { 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/moves.ts b/data/mods/gen9ssb/moves.ts index a18e2fc66f..a09ac2d8e4 100644 --- a/data/mods/gen9ssb/moves.ts +++ b/data/mods/gen9ssb/moves.ts @@ -84,7 +84,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { source.eatItem(true); }, }, - secondary: null, target: "normal", type: "Steel", }, @@ -109,7 +108,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-anim', pokemon, 'Shift Gear', pokemon); this.boost({ spe: 2, atk: 1 }); }, - secondary: null, target: "self", type: "Steel", }, @@ -141,7 +139,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { spa: -2, }, }, - secondary: null, target: "normal", type: "Ghost", }, @@ -188,7 +185,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, }, - secondary: null, target: "self", type: "Water", }, @@ -218,7 +214,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { if (target.addVolatile('healblock', source)) success = true; return success; }, - secondary: null, target: "normal", type: "Grass", }, @@ -299,7 +294,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.boost({ spa: -1, spd: -1 }, source); } }, - secondary: null, target: "normal", type: "Normal", }, @@ -370,7 +364,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-anim', source, 'Flower Trick', target); this.add('-anim', source, 'Flower Trick', target); }, - secondary: null, target: "normal", type: "Grass", }, @@ -474,7 +467,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { changeSet(this, pokemon, ssbSets['A Quag To The Past'], true); } }, - secondary: null, target: "self", type: "Ground", }, @@ -512,7 +504,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { return success; }, isZ: "lilligantiumz", - secondary: null, target: "self", type: "Grass", }, @@ -563,7 +554,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { multihit: 5, multiaccuracy: true, forceSTAB: true, - secondary: null, target: 'normal', type: "Fire", }, @@ -614,7 +604,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.heal(source.baseMaxhp / 2, source); } }, - secondary: null, target: "self", type: "Psychic", }, @@ -638,7 +627,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-anim', source, 'Earthquake', target); }, volatileStatus: 'flinch', - secondary: null, target: "normal", type: "???", }, @@ -766,7 +754,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { spa: 2, spd: 1, }, - secondary: null, target: "self", type: "Psychic", }, @@ -999,7 +986,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { onAfterMoveSecondarySelf(pokemon, target, move) { if (!target || target.fainted || target.hp <= 0) this.boost({ atk: 2 }, pokemon, pokemon, move); }, - secondary: null, target: "normal", type: "Bug", }, @@ -1030,7 +1016,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-item', pokemon, item, '[from] move: what kind'); this.heal(pokemon.baseMaxhp / 4, pokemon); }, - secondary: null, target: "self", type: "Water", }, @@ -1075,11 +1060,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, onTryHitPriority: 3, onTryHit(target, source, move) { - if (!move.flags['protect']) { - if (['gmaxoneblow', 'gmaxrapidflow'].includes(move.id)) return; - if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true; - return; - } + if (this.checkMoveBypassesProtect(move, source, target)) return; if (move.smartTarget) { move.smartTarget = false; } else { @@ -1117,7 +1098,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, }, - secondary: null, target: "self", type: "Dark", }, @@ -1190,11 +1170,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, onTryHitPriority: 3, onTryHit(target, source, move) { - if (!move.flags['protect']) { - if (['gmaxoneblow', 'gmaxrapidflow'].includes(move.id)) return; - if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true; - return; - } + if (this.checkMoveBypassesProtect(move, source, target)) return; if (move.smartTarget) { move.smartTarget = false; } else { @@ -1218,7 +1194,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, }, - secondary: null, target: "self", type: "Normal", }, @@ -1241,7 +1216,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { onEffectiveness(typeMod, target, type, move) { return typeMod + this.dex.getEffectiveness('Fire', type); }, - secondary: null, target: "normal", type: "Water", }, @@ -1280,7 +1254,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { source.skipBeforeSwitchOutEventFlag = false; } }, - secondary: null, target: "self", type: "Normal", }, @@ -1366,7 +1339,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } } }, - secondary: null, target: "self", type: "Normal", // bird type crashes during testing (runStatusImmunity for Bird at sim\pokemon.ts:2101:10). no-go. @@ -1476,7 +1448,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { pokemon.setStatus(status); } }, - secondary: null, target: "self", type: "Electric", }, @@ -1542,7 +1513,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { onMoveFail(target, source, move) { this.damage(source.baseMaxhp / 2, source, source, this.dex.conditions.get('High Jump Kick')); }, - secondary: null, target: "normal", type: "Grass", }, @@ -1578,7 +1548,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { const success = !!this.heal(this.modify(source.maxhp, 0.25)); return source.addVolatile('magnetrise', source, move) || success; }, - secondary: null, target: "self", type: "Normal", }, @@ -1665,7 +1634,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { onHit(target) { this.actions.useMove('batonpass', target); }, - secondary: null, target: "self", type: "Normal", }, @@ -1742,7 +1710,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { return target.addVolatile('trapped', source, move, 'trapper') || success; }, zMove: { effect: 'heal' }, - secondary: null, target: "normal", type: "Ghost", }, @@ -1769,7 +1736,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-anim', source, 'U-turn', target); }, selfSwitch: true, - secondary: null, target: "normal", type: "Flying", }, @@ -1980,7 +1946,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { onDamage(damage, target, source, effect) { if (damage >= target.hp) return target.hp - 1; }, - secondary: null, target: "normal", type: "Dark", }, @@ -2021,7 +1986,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } target.addVolatile('hacked'); }, - secondary: null, target: "normal", type: "Ghost", }, @@ -2062,7 +2026,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { def: 2, }, // passive recovery implemented in conditions.ts - secondary: null, target: "self", type: "Normal", }, @@ -2132,7 +2095,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }; pokemon.moveSlots[teaIndex] = newMoveSlot; }, - secondary: null, target: 'self', type: "Flying", }, @@ -2151,7 +2113,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.attrLastMove('[anim] Bleakwind Storm'); }, multihit: 5, - secondary: null, target: 'normal', type: "Flying", }, @@ -2176,7 +2137,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, selfSwitch: true, recoil: [33, 100], - secondary: null, target: 'normal', type: "Fighting", }, @@ -2214,7 +2174,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, }, - secondary: null, target: 'normal', type: "Grass", }, @@ -2251,7 +2210,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { target.addVolatile('taunt', source); } }, - secondary: null, target: 'normal', type: "Bug", }, @@ -2323,7 +2281,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { spe: 1, atk: 1, }, - secondary: null, target: 'self', type: "Poison", }, @@ -2351,7 +2308,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.field.addPseudoWeather('gravity', source); }, }, - secondary: null, target: 'normal', type: "???", }, @@ -2428,7 +2384,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { self: { volatileStatus: 'protect', }, - secondary: null, target: "normal", type: "Normal", }, @@ -2492,7 +2447,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { duration: 1, // reviving implemented in side.ts, kind of }, - secondary: null, target: "self", type: "Dark", }, @@ -2660,7 +2614,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { self: { sideCondition: 'safeguard', }, - secondary: null, multihit: 3, target: "normal", type: "Ground", @@ -2751,7 +2704,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add(`c:|${getName((source.illusion || source).name)}|${msg}`); }, isZ: "irpatuziniumz", - secondary: null, target: "normal", type: "Fairy", }, @@ -2769,7 +2721,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { onPrepareHit(target, source) { this.attrLastMove('[anim] High Jump Kick'); }, - secondary: null, target: "allAdjacent", type: "Psychic", }, @@ -2797,7 +2748,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-anim', source, 'Snowscape', target); }, weather: 'snowscape', - secondary: null, target: "self", type: "Ice", }, @@ -2813,7 +2763,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { pp: 5, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, recoil: [1, 2], - secondary: null, priority: 0, onTryMove() { this.attrLastMove('[still]'); @@ -2848,7 +2797,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { onTryMove() { this.attrLastMove('[still]'); }, - secondary: null, target: "normal", type: "Fighting", }, @@ -2987,7 +2935,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { def: -1, spe: -1, }, - secondary: null, target: "normal", type: "Rock", }, @@ -3099,7 +3046,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-fieldend', 'move: Anfield Atmosphere'); }, }, - secondary: null, target: "all", type: "Psychic", }, @@ -3135,7 +3081,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { pokemon.forceSwitchFlag = true; } }, - secondary: null, target: "all", type: "Flying", }, @@ -3183,14 +3128,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { flags: {}, volatileStatus: 'curse', onHit(target, source) { - const result = this.random(3); - if (result === 0) { - target.trySetStatus('psn', target); - } else if (result === 1) { - target.trySetStatus('par', target); - } else { - target.trySetStatus('brn', target); - } + const status = this.sample(['psn', 'par', 'brn']); + target.trySetStatus(status, source); this.boost({ spe: 1 }, source); }, onPrepareHit(target, source) { @@ -3213,7 +3152,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { priority: 1, flags: { protect: 1, mirror: 1, metronome: 1 }, multihit: [2, 5], - secondary: null, onTryMove() { this.attrLastMove('[still]'); }, @@ -3329,7 +3267,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, }, - secondary: null, target: "normal", type: "Steel", contestType: "Clever", @@ -3380,7 +3317,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-end', target, 'Rise Above'); }, }, - secondary: null, target: "self", type: "Electric", }, @@ -3404,7 +3340,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, pseudoWeather: 'trickroom', volatileStatus: 'powertrick', - secondary: null, target: "self", type: "Psychic", }, @@ -3506,8 +3441,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { attacker.addVolatile('twoturnmove', defender); return null; }, - secondary: null, - hasSheerForce: true, + hasSheerForceBoost: true, onPrepareHit(target, source) { this.attrLastMove('[still]'); this.add('-anim', source, 'Lunar Dance', target); @@ -3545,7 +3479,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-start', source, 'typeadd', 'Fire', '[from] move: Wrath of Frozen Flames'); } }, - secondary: null, target: "normal", type: "Dragon", }, @@ -3567,7 +3500,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { onPrepareHit() { this.attrLastMove('[anim] Core Enforcer'); }, - secondary: null, target: "normal", type: "Ghost", }, @@ -3593,7 +3525,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add(`c:|${getName((source.illusion || source).name)}|Sorry i tried to fix smth but accidentally broke your ability :( will fix it next week`); }, ignoreAbility: true, - secondary: null, target: "normal", type: "Normal", }, @@ -3630,7 +3561,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { pokemon.forceSwitchFlag = true; } }, - secondary: null, target: "all", type: "Electric", }, @@ -3685,7 +3615,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { source.addVolatile('imprison', source); source.m.usedPlagiarism = true; }, - secondary: null, target: "normal", type: "Dark", }, @@ -3719,7 +3648,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { spe: 1, }, }, - secondary: null, target: "all", type: "Dragon", }, @@ -3745,7 +3673,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { onEffectiveness(typeMod, target, type) { if (type === 'Water') return 1; }, - secondary: null, target: "normal", type: "Ice", }, @@ -3785,17 +3712,11 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { if (randomStat2 && randomStat === randomStat2) boost[randomStat] = 4; else if (randomStat2) boost[randomStat2] = 2; this.boost(boost, source); - const result = this.random(3); - if (result === 0) { - this.actions.useMove("laserfocus", target); - } else if (result === 1) { - this.actions.useMove("lockon", target); - } else { - this.actions.useMove("charge", target); - } // This is easier than implementing each condition manually + // This is easier than implementing each condition manually + const move = this.sample(['lockon', 'laserfocus', 'charge']); + this.actions.useMove(move, target); this.heal(target.maxhp / 4, target, target, this.effect); }, - secondary: null, target: "self", type: "Grass", }, @@ -3889,7 +3810,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, selfSwitch: true, - secondary: null, target: "normal", type: "Ice", }, @@ -3960,7 +3880,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, }, - secondary: null, target: "all", type: "Steel", }, @@ -4024,7 +3943,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { target.addVolatile('taunt', source, move); } }, - secondary: null, target: "normal", type: "Ghost", }, @@ -4076,12 +3994,8 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, onTryHitPriority: 3, onTryHit(target, source, move) { - if (!move.flags['protect']) { - if (['gmaxoneblow', 'gmaxrapidflow'].includes(move.id)) return; - if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true; - return; - } - if (move && (move.target === 'self' || move.category === 'Status')) return; + if (move.target === 'self') return; + if (this.checkMoveBypassesProtect(move, source, target, false)) return; this.add('-activate', target, 'move: Alting', move.name); const lockedmove = source.getVolatile('lockedmove'); if (lockedmove) { @@ -4159,7 +4073,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-message', `${pokemon.name} gained 10 levels!`); }, isZ: "pearyumz", - secondary: null, target: "self", type: "Steel", }, @@ -4565,7 +4478,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { return success || !!this.canSwitch(source.side); }, selfSwitch: true, - secondary: null, target: "self", type: "Normal", }, @@ -4604,7 +4516,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, isZ: "rainiumz", - secondary: null, target: "self", type: "Water", }, @@ -4627,7 +4538,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { onPrepareHit(target, source) { this.add('-anim', source, 'Photon Geyser', target); }, - secondary: null, target: "normal", type: "Psychic", }, @@ -4721,7 +4631,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-anim', source, 'Dragon Dance', source); this.add('-anim', source, 'Lock-On', source); }, - secondary: null, target: "self", type: "Fire", }, @@ -4811,7 +4720,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { const success = !!this.heal(this.modify(pokemon.maxhp, 0.5)); return pokemon.cureStatus() || success; }, - secondary: null, target: "self", type: "Water", }, @@ -4944,7 +4852,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.actions.useMove(icebeam, target); return null; }, - secondary: null, target: "self", type: "Electric", }, @@ -4989,7 +4896,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { target.addVolatile('leechseed', source); } }, - secondary: null, target: "normal", type: "Grass", }, @@ -5022,7 +4928,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } }, }, - secondary: null, target: "normal", type: "Grass", }, @@ -5143,7 +5048,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { if (target?.positiveBoosts()) return priority + 1; return priority; }, - secondary: null, target: "normal", type: "Steel", }, @@ -5167,7 +5071,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { onPrepareHit(target, source) { this.add('-anim', source, 'Burn Up', target); }, - secondary: null, target: "normal", type: "Fire", }, @@ -5242,7 +5145,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { def: 1, spd: 1, }, - secondary: null, target: "self", type: "Fire", }, @@ -5289,7 +5191,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { pokemon.removeVolatile('phantomweapon'); }, }, - secondary: null, target: "normal", type: "Ghost", }, @@ -5314,7 +5215,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-anim', source, 'Nasty Plot', source); this.add('-anim', source, 'Head Smash', target); }, - secondary: null, target: "normal", type: "Steel", }, @@ -5340,7 +5240,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { onPrepareHit(target, source) { this.add('-anim', source, 'Aura Sphere', source); }, - secondary: null, target: "normal", type: "Fighting", }, @@ -5366,7 +5265,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, multihit: 10, multiaccuracy: true, - secondary: null, target: "normal", type: "Poison", }, @@ -5395,7 +5293,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { target?.faint(source); }, ignoreImmunity: true, - secondary: null, target: "normal", type: "Ghost", }, @@ -5441,7 +5338,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-anim', source, 'Focus Energy', target); this.add('-anim', source, 'Agility', target); }, - secondary: null, target: "self", type: "Psychic", }, @@ -5501,7 +5397,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add(`c:|${getName((pokemon.illusion || pokemon).name)}|he do be searching for rocks tho`); return !!this.queue.willAct() && this.runEvent('StallMove', pokemon); }, - secondary: null, target: "self", type: "Ground", }, @@ -5566,7 +5461,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { return success; }, }, - secondary: null, target: "normal", type: "Ghost", }, @@ -5595,7 +5489,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { target.addVolatile('attract', source); target.addVolatile('confusion', source); }, - secondary: null, target: "normal", type: "Normal", }, @@ -5631,7 +5524,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } } }, - secondary: null, target: "normal", type: "Psychic", }, @@ -5667,7 +5559,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-end', pokemon, 'Symphonie du Ze\u0301ro'); }, }, - secondary: null, target: "normal", type: "Fairy", }, @@ -5744,7 +5635,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('-anim', source, 'U-Turn', target); }, selfSwitch: true, - secondary: null, target: "normal", type: "Flying", }, @@ -5782,7 +5672,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } this.boost({ atk: boost }, pokemon, pokemon, move); }, - secondary: null, target: "normal", type: "Steel", }, @@ -5831,7 +5720,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { return success; }, ignoreAbility: true, - secondary: null, target: "normal", type: "Flying", }, @@ -5874,7 +5762,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.add('detailschange', pokemon, details); } }, - secondary: null, target: "normal", type: "Grass", }, @@ -5890,7 +5777,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { pp: 10, priority: 0, flags: { sound: 1, failcopycat: 1 }, - secondary: null, onTryMove() { this.attrLastMove('[still]'); }, @@ -5933,7 +5819,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { pp: 10, priority: 0, flags: {}, - secondary: null, selfSwitch: true, onTryMove() { this.attrLastMove('[still]'); @@ -6010,7 +5895,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { attacker.addVolatile('twoturnmove', defender); return null; }, - secondary: null, target: "normal", type: "Flying", }, @@ -6027,7 +5911,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, heal: 1, metronome: 1 }, drain: [1, 2], - secondary: null, target: "allAdjacent", type: "Water", onTryMove() { @@ -6087,7 +5970,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { return this.chainModify(1.5); }, }, - secondary: null, target: "self", type: "Normal", }, @@ -6117,7 +5999,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { return this.chainModify(1.75); } }, - secondary: null, target: "normal", type: "Fire", }, @@ -6135,7 +6016,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { flags: { reflectable: 1, mirror: 1, bypasssub: 1, allyanim: 1, metronome: 1, noassist: 1, failcopycat: 1, wind: 1 }, forceSwitch: true, status: 'tox', - secondary: null, target: "normal", type: "Poison", }, @@ -6170,7 +6050,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } } }, - secondary: null, target: "normal", type: "Dark", }, @@ -6200,7 +6079,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } this.add(`c:|${getName((source.illusion || source).name)}|A blank canvas.`); }, - secondary: null, target: "normal", type: "Ice", }, @@ -6234,7 +6112,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, }, selfSwitch: true, - secondary: null, target: "self", type: "Dark", }, @@ -6298,7 +6175,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { didSomething = pokemon.addVolatile('aquaring') || didSomething; return didSomething; }, - secondary: null, target: "self", type: "Water", }, @@ -6330,7 +6206,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { } target.trySetStatus('par', source, move); }, - secondary: null, target: "normal", type: "Normal", }, @@ -6370,7 +6245,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { ignoreNegativeOffensive: true, breaksProtect: true, ignoreAccuracy: true, - secondary: null, target: "normal", type: "Normal", }, @@ -6409,7 +6283,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { spd: 1, }, }, - secondary: null, target: "self", type: "Fire", }, @@ -6426,7 +6299,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, overrideOffensivePokemon: 'target', - secondary: null, target: "normal", type: "Dark", onTryMove() { @@ -6709,7 +6581,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { if (!target.isGrounded()) { const baseMove = this.dex.moves.get(effect.id); if (baseMove.priority > 0) { - this.hint("Psychic Terrain doesn't affect Pokémon immune to Ground."); + this.hint("Psychic Terrain doesn't affect airborne Pokémon."); } return; } @@ -7062,7 +6934,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { this.actions.useMove(randomMove, target); }, multihit: [2, 5], - secondary: null, target: "self", type: "???", }, diff --git a/data/mods/gen9ssb/scripts.ts b/data/mods/gen9ssb/scripts.ts index f1b3cbba00..b146c1d0f3 100644 --- a/data/mods/gen9ssb/scripts.ts +++ b/data/mods/gen9ssb/scripts.ts @@ -142,11 +142,12 @@ export function changeMoves(context: Battle, pokemon: Pokemon, newMoves: (string const moveName = Array.isArray(newMove) ? newMove[context.random(newMove.length)] : newMove; const move = context.dex.moves.get(context.toID(moveName)); if (!move.id) continue; + const pp = context.calculatePP(move); const moveSlot = { move: move.name, id: move.id, - pp: Math.floor((move.noPPBoosts ? move.pp : move.pp * 8 / 5) * carryOver[slot]), - maxpp: (move.noPPBoosts ? move.pp : move.pp * 8 / 5), + pp: pp * carryOver[slot], + maxpp: pp, target: move.target, disabled: false, disabledSource: '', @@ -374,40 +375,8 @@ export const Scripts: ModdedBattleScriptsData = { this.add('start'); - // Change Zacian/Zamazenta into their Crowned formes for (const pokemon of this.getAllPokemon()) { - let rawSpecies: Species | null = null; - if (pokemon.species.id === 'zacian' && pokemon.item === 'rustedsword') { - rawSpecies = this.dex.species.get('Zacian-Crowned'); - } else if (pokemon.species.id === 'zamazenta' && pokemon.item === 'rustedshield') { - rawSpecies = this.dex.species.get('Zamazenta-Crowned'); - } - if (!rawSpecies) continue; - const species = pokemon.setSpecies(rawSpecies); - if (!species) continue; - pokemon.baseSpecies = rawSpecies; - pokemon.details = pokemon.getUpdatedDetails(); - // pokemon.setAbility(species.abilities['0'], null, null, true); - // pokemon.baseAbility = pokemon.ability; - - const behemothMove: { [k: string]: string } = { - 'Zacian-Crowned': 'behemothblade', 'Zamazenta-Crowned': 'behemothbash', - }; - const ironHead = pokemon.baseMoves.indexOf('ironhead'); - if (ironHead >= 0) { - const move = this.dex.moves.get(behemothMove[rawSpecies.name]); - pokemon.baseMoveSlots[ironHead] = { - 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, - disabledSource: '', - used: false, - }; - pokemon.moveSlots = pokemon.baseMoveSlots.slice(); - } + this.singleEvent('BattleStart', this.dex.conditions.getByID(pokemon.species.id), pokemon.speciesState, pokemon); } this.format.onBattleStart?.call(this); @@ -429,9 +398,6 @@ export const Scripts: ModdedBattleScriptsData = { } } } - for (const pokemon of this.getAllPokemon()) { - this.singleEvent('Start', this.dex.conditions.getByID(pokemon.species.id), pokemon.speciesState, pokemon); - } this.midTurn = true; break; } @@ -806,8 +772,12 @@ export const Scripts: ModdedBattleScriptsData = { // Final modifier. Modifiers that modify damage after min damage check, such as Life Orb. baseDamage = this.battle.runEvent('ModifyDamage', pokemon, target, move, baseDamage); - if (move.isZOrMaxPowered && target.getMoveHitData(move).zBrokeProtect) { + const bypassProtect = target.getMoveHitData(move).bypassProtect; + if (bypassProtect) { baseDamage = this.battle.modify(baseDamage, 0.25); + if (bypassProtect !== true && bypassProtect.effectType === 'Ability') { + this.battle.add('-ability', pokemon, bypassProtect.name); + } this.battle.add('-zbroken', target); } @@ -963,26 +933,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/gen8linked/conditions.ts b/data/mods/linked/conditions.ts similarity index 56% rename from data/mods/gen8linked/conditions.ts rename to data/mods/linked/conditions.ts index de549ffb2a..e17d70bc02 100644 --- a/data/mods/gen8linked/conditions.ts +++ b/data/mods/linked/conditions.ts @@ -21,7 +21,7 @@ export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDa frz: { inherit: true, onBeforeMove(pokemon, target, move) { - if (move.flags['defrost']) return; + if (move.flags['defrost'] && !(move.id === 'burnup' && !pokemon.hasType('Fire'))) return; if (this.effectState.durationRolled !== this.turn && this.randomChance(1, 5)) { pokemon.cureStatus(); return; @@ -46,17 +46,14 @@ export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDa } } this.add('-activate', pokemon, 'confusion'); - if (!this.randomChance(1, 3)) { + if (!this.randomChance(33, 100)) { return; } this.activeTarget = pokemon; - const damage = this.actions.getDamage(pokemon, pokemon, 40); + const damage = this.actions.getConfusionDamage(pokemon, 40); if (typeof damage !== 'number') throw new Error("Confusion damage not dealt"); - this.damage(damage, pokemon, pokemon, { - id: 'confused' as ID, - effectType: 'Move', - type: '???', - } as unknown as ActiveMove); + const activeMove = { id: this.toID('confused'), effectType: 'Move', type: '???' }; + this.damage(damage, pokemon, pokemon, activeMove as ActiveMove); return false; }, }, @@ -66,4 +63,28 @@ export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDa if (pokemon.moveThisTurn) pokemon.removeVolatile('gem'); }, }, + // Prior to Gen 9, using these moves as part of a link resulted in locking into an entire link. + // However, such behavior has since been deemed counter-intuitive. + // https://www.smogon.com/forums/threads/3776838 + // + // Outrage/Thrash/Petal Dance should be consistent with Choice items. + lockedmove: { + inherit: true, + onStart(target, source, effect) { + this.effectState.trueDuration = this.random(2, 4); + this.effectState.move = effect.id; + this.queue.cancelMove(source); + }, + }, + // A general rule of thumb to keep in mind is that all effects of move 1 + // will follow through before the next move activates. However, apparently, + // moves such as Skull Bash/Meteor Beam/etc never respected that prior to Gen 9. + // + // Ensure we lock into Skull Bash/Meteor Beam/etc. + twoturnmove: { + inherit: true, + onOverrideAction(pokemon, target, move) { + return this.effectState.move; + }, + }, }; diff --git a/data/mods/linked/moves.ts b/data/mods/linked/moves.ts new file mode 100644 index 0000000000..fd685b0a86 --- /dev/null +++ b/data/mods/linked/moves.ts @@ -0,0 +1,294 @@ +export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { + pursuit: { + inherit: true, + beforeTurnCallback(pokemon) { + // @ts-expect-error modded + const linkedMoves: [ActiveMove, ActiveMove] = pokemon.getLinkedMoves(); + if (linkedMoves.length) { + if (linkedMoves[0].id !== 'pursuit' && linkedMoves[1].id === 'pursuit') return; + } + + for (const target of pokemon.foes()) { + target.addVolatile('pursuit'); + const data = target.volatiles['pursuit']; + if (!data.sources) { + data.sources = []; + } + data.sources.push(pokemon); + } + }, + }, + mefirst: { + inherit: true, + onTryHit(target, pokemon) { + const action = this.queue.willMove(target); + if (!action) return false; + // Mod-specific: Me First copies the first move in the link + // @ts-expect-error modded + const move = this.dex.getActiveMove(action.linked?.[0] || action.move.id); + if (action.zmove || move.isZ || move.isMax) return false; + if (target.volatiles['mustrecharge']) return false; + if (move.category === 'Status' || move.flags['failmefirst']) return false; + + pokemon.addVolatile('mefirst'); + this.actions.useMove(move, pokemon, { target }); + return null; + }, + }, + + // Modify Sucker Punch to check if both moves in a link are status + suckerpunch: { + inherit: true, + onTry(source, target) { + const action = this.queue.willMove(target); + if (!action || action.choice !== 'move') return false; + // @ts-expect-error modded + if (!action.linked) { + const move = action.move; + if (move.category === 'Status' && move.id !== 'mefirst') { + return false; + } + } else { + // @ts-expect-error modded + if (action.linked.every(move => move.category === 'Status' && move.id !== 'mefirst')) { + return false; + } + } + if (target.volatiles['mustrecharge'] && target.volatiles['mustrecharge'].duration! < 2) { + // Duration may not be lower than 2 if Sucker Punch is used as a low-priority move + // i.e. if Sucker Punch is linked with a negative priority move + return false; + } + }, + }, + thunderclap: { + inherit: true, + onTry(source, target) { + const action = this.queue.willMove(target); + if (!action || action.choice !== 'move') return false; + // @ts-expect-error modded + if (!action.linked) { + const move = action.move; + if (move.category === 'Status' && move.id !== 'mefirst') { + return false; + } + } else { + // @ts-expect-error modded + if (action.linked.every(move => move.category === 'Status' && move.id !== 'mefirst')) { + return false; + } + } + if (target.volatiles['mustrecharge'] && target.volatiles['mustrecharge'].duration! < 2) { + // Duration may not be lower than 2 if Sucker Punch is used as a low-priority move + // i.e. if Sucker Punch is linked with a negative priority move + return false; + } + }, + }, + upperhand: { + inherit: true, + onTry(source, target) { + const action = this.queue.willMove(target); + if (!action || action.choice !== 'move') return false; + // @ts-expect-error modded + if (!action.linked) { + const move = action.move; + if (move.priority < 0.1 || move.category === 'Status') { + return false; + } + } else { + // @ts-expect-error modded + if (action.linked.every(move => move.priority < 0.1 || move.category === 'Status')) { + return false; + } + } + if (target.volatiles['mustrecharge'] && target.volatiles['mustrecharge'].duration! < 2) { + // Duration may not be lower than 2 if Sucker Punch is used as a low-priority move + // i.e. if Sucker Punch is linked with a negative priority move + return false; + } + }, + }, + + encore: { + inherit: true, + condition: { + duration: 3, + noCopy: true, // doesn't get copied by Z-Baton Pass + onStart(target) { + let move: Move | ActiveMove | null = target.lastMove; + if (!move || target.volatiles['dynamax']) return false; + // Encore only works on Max Moves if the base move is not itself a Max Move + if (move.isMax && move.baseMove) move = this.dex.moves.get(move.baseMove); + // @ts-expect-error modded + const linkedMoves: [ActiveMove, ActiveMove] = target.getLinkedMoves(true); + const moveSlot = target.getMoveData(move.id); + const isLinkedMove = linkedMoves.some(x => x.id === move.id); + if (isLinkedMove && linkedMoves.every(m => !!m.flags['failencore'])) { + // both moves cannot be encored + delete target.volatiles['encore']; + return false; + } + if (move.isZ || move.isMax || move.flags['failencore'] || !moveSlot || moveSlot.pp <= 0) { + // it failed + return false; + } + this.effectState.timesActivated = {}; + this.effectState.move = move.id; + this.add('-start', target, 'Encore'); + if (isLinkedMove) { + this.effectState.move = linkedMoves; + } + if (!this.queue.willMove(target)) { + this.effectState.duration!++; + } + }, + onOverrideAction(pokemon, target, move) { + if (!this.effectState.timesActivated[this.turn]) { + // Initialize Encore effect for this turn + this.effectState.timesActivated[this.turn] = 0; + } else if (this.effectState.timesActivated[this.turn] >= (Array.isArray(this.effectState.move) ? + this.effectState.move.length : 1)) { + // Finish Encore effect for this turn + return; + } + this.effectState.timesActivated[this.turn]++; + if (!Array.isArray(this.effectState.move)) { + this.queue.cancelAction(pokemon); + if (move.id !== this.effectState.move) return this.effectState.move; + } else { + // Locked into a link + switch (this.effectState.timesActivated[this.turn]) { + case 1: { + if (this.effectState.move[0] !== move.id) return this.effectState.move[0]; + return; + } + case 2: + if (this.effectState.move[1] !== move.id) return this.effectState.move[1]; + return; + } + } + }, + onResidualOrder: 13, + onResidual(target) { + if (Array.isArray(this.effectState.move)) { + if (this.effectState.move.map(move => target.getMoveData(move)).some(moveSlot => !moveSlot || moveSlot.pp <= 0)) { + target.removeVolatile('encore'); + } + } else { + const moveSlot = target.getMoveData(this.effectState.move); + if (!moveSlot || moveSlot.pp <= 0) { + target.removeVolatile('encore'); + } + } + }, + onEnd(target) { + this.add('-end', target, 'Encore'); + }, + onDisableMove(pokemon) { + if (!this.effectState.move) return; + if (Array.isArray(this.effectState.move)) { + if (this.effectState.move.every(move => !pokemon.hasMove(move))) return; + for (const moveSlot of pokemon.moveSlots) { + if (!this.effectState.move.map(move => move.id).includes(moveSlot.id)) { + pokemon.disableMove(moveSlot.id); + } + } + } else { + if (!pokemon.hasMove(this.effectState.move)) return; + for (const moveSlot of pokemon.moveSlots) { + if (moveSlot.id !== this.effectState.move) { + pokemon.disableMove(moveSlot.id); + } + } + } + }, + }, + }, + torment: { + inherit: true, + condition: { + noCopy: true, + onStart(pokemon, source, effect) { + if (pokemon.volatiles['dynamax']) { + delete pokemon.volatiles['torment']; + return false; + } + if (effect?.id === 'gmaxmeltdown') this.effectState.duration = 3; + this.add('-start', pokemon, 'Torment'); + }, + onEnd(pokemon) { + this.add('-end', pokemon, 'Torment'); + }, + onDisableMove(pokemon) { + const lastMove = pokemon.lastMove; + if (!lastMove || lastMove.id === 'struggle') return; + + pokemon.disableMove(lastMove.id); + // @ts-expect-error + const { linkIndex, linkedMoves } = pokemon.queryLinkMove(lastMove); + if (linkIndex >= 0) pokemon.disableMove(linkedMoves[1 - linkIndex].id); + }, + }, + }, + + // PP-decreasing moves + grudge: { + inherit: true, + condition: { + onStart(pokemon) { + this.add('-singlemove', pokemon, 'Grudge'); + }, + onFaint(target, source, effect) { + if (!source || source.fainted || !effect) return; + let move = source.lastMove; + if (effect.effectType === 'Move' && !effect.flags['futuremove'] && move) { + if (move.isMax && move.baseMove) move = this.dex.moves.get(move.baseMove) as ActiveMove; + for (const moveSlot of source.moveSlots) { + if (moveSlot.id === move.id) { + moveSlot.pp = 0; + this.add('-activate', source, 'move: Grudge', move.name); + } + } + } + }, + onBeforeMovePriority: 100, + onBeforeMove(pokemon) { + if (pokemon.moveThisTurn) return; // Second stage of a Linked move + this.debug('removing Grudge before attack'); + pokemon.removeVolatile('grudge'); + }, + }, + }, + + // Other lastMove checks + destinybond: { + inherit: true, + condition: { + onStart(pokemon) { + this.add('-singlemove', pokemon, 'Destiny Bond'); + }, + onFaint(target, source, effect) { + if (!source || !effect || target.isAlly(source)) return; + if (effect.effectType === 'Move' && !effect.flags['futuremove']) { + if (source.volatiles['dynamax']) { + this.add('-hint', "Dynamaxed Pokémon are immune to Destiny Bond."); + return; + } + this.add('-activate', target, 'move: Destiny Bond'); + source.faint(); + } + }, + onBeforeMovePriority: -1, + onBeforeMove(pokemon, target, move) { + // Second stage of a Linked move does not remove Destiny Bond + if (pokemon.moveThisTurn || move.id === 'destinybond') return; + this.debug('removing Destiny Bond before attack'); + pokemon.removeVolatile('destinybond'); + }, + onMoveAborted(pokemon, target, move) { + pokemon.removeVolatile('destinybond'); + }, + }, + }, +}; diff --git a/data/mods/gen8linked/scripts.ts b/data/mods/linked/scripts.ts similarity index 62% rename from data/mods/gen8linked/scripts.ts rename to data/mods/linked/scripts.ts index 1962e1d16f..30770f2651 100644 --- a/data/mods/gen8linked/scripts.ts +++ b/data/mods/linked/scripts.ts @@ -1,6 +1,20 @@ export const Scripts: ModdedBattleScriptsData = { - inherit: 'gen8', - gen: 8, + gen: 9, + init() { + // Since twoturnmove isn't currently implemented using linked volatiles, + // patch related moves so that 'twoturnmove' and e.g. 'skullbash' end simultaneously. + const removeTwoTurnMove = function (target: Pokemon) { + // Cannot use target.removeVolatile, since it would cause stack overflow. + delete target.volatiles['twoturnmove']; + }; + for (const id in this.data.Moves) { + if (this.data.Moves[id].flags['charge'] && id !== 'skydrop') { + this.modData("Moves", id).condition ||= {}; + if ('onEnd' in this.modData("Moves", id).condition) throw new Error(`onEnd needs manual override for move ${id}`); + this.modData("Moves", id).condition.onEnd = removeTwoTurnMove; + } + } + }, getActionSpeed(action) { if (action.choice === 'move') { let move = action.move; @@ -22,29 +36,32 @@ export const Scripts: ModdedBattleScriptsData = { } } } - // take priority from the base move, so abilities like Prankster only apply once - // (instead of compounding every time `getActionSpeed` is called) - let priority = this.dex.moves.get(move.id).priority; - // Grassy Glide priority - priority = this.singleEvent('ModifyPriority', move, null, action.pokemon, null, null, priority); - priority = this.runEvent('ModifyPriority', action.pokemon, null, move, priority); // Linked mod - const linkedMoves: [string, string] = action.pokemon.getLinkedMoves(); - let linkIndex = -1; - if (linkedMoves.length && !move.isZ && !move.isMax && (linkIndex = linkedMoves.indexOf(this.toID(action.move))) >= 0) { - const linkedActions = action.linked || linkedMoves.map(moveid => this.dex.getActiveMove(moveid)); + const { linkIndex, linkedMoves } = action.pokemon.queryLinkMove(action.move); + if (linkIndex >= 0 && action.pokemon.getCanLinkMove(action.move)) { + const linkedActions = action.linked || linkedMoves; + const originalMove = linkedActions[linkIndex]; const altMove = linkedActions[1 - linkIndex]; - const thisPriority = this.runEvent('ModifyPriority', action.pokemon, null, linkedActions[linkIndex], priority); - const thatPriority = this.runEvent('ModifyPriority', action.pokemon, null, altMove, altMove.priority); - priority = Math.min(thisPriority, thatPriority); + let thisPriority = this.dex.moves.get(originalMove.id).priority; + thisPriority = this.singleEvent('ModifyPriority', originalMove, null, action.pokemon, null, null, thisPriority); + thisPriority = this.runEvent('ModifyPriority', action.pokemon, null, originalMove, thisPriority); + let thatPriority = this.dex.moves.get(altMove.id).priority; + thatPriority = this.singleEvent('ModifyPriority', altMove, null, action.pokemon, null, null, thatPriority); + thatPriority = this.runEvent('ModifyPriority', action.pokemon, null, altMove, thatPriority); + const priority = Math.min(thisPriority, thatPriority); action.priority = priority + action.fractionalPriority; if (this.gen > 5) { // Gen 6+: Quick Guard blocks moves with artificially enhanced priority. // This also applies to Psychic Terrain. - linkedActions[linkIndex].priority = priority; + originalMove.priority = priority; altMove.priority = priority; } } else { + // take priority from the base move, so abilities like Prankster only apply once + // (instead of compounding every time `getActionSpeed` is called) + let priority = this.dex.moves.get(move.id).priority; + priority = this.singleEvent('ModifyPriority', move, null, action.pokemon, null, null, priority); + priority = this.runEvent('ModifyPriority', action.pokemon, null, move, priority); action.priority = priority + action.fractionalPriority; // In Gen 6, Quick Guard blocks moves with artificially enhanced priority. if (this.gen > 5) action.move.priority = priority; @@ -70,40 +87,8 @@ export const Scripts: ModdedBattleScriptsData = { this.add('start'); - // Change Zacian/Zamazenta into their Crowned formes for (const pokemon of this.getAllPokemon()) { - let rawSpecies: Species | null = null; - if (pokemon.species.id === 'zacian' && pokemon.item === 'rustedsword') { - rawSpecies = this.dex.species.get('Zacian-Crowned'); - } else if (pokemon.species.id === 'zamazenta' && pokemon.item === 'rustedshield') { - rawSpecies = this.dex.species.get('Zamazenta-Crowned'); - } - if (!rawSpecies) continue; - const species = pokemon.setSpecies(rawSpecies); - if (!species) continue; - pokemon.baseSpecies = rawSpecies; - pokemon.details = pokemon.getUpdatedDetails(); - // pokemon.setAbility(species.abilities['0'], null, null, true); - // pokemon.baseAbility = pokemon.ability; - - const behemothMove: { [k: string]: string } = { - 'Zacian-Crowned': 'behemothblade', 'Zamazenta-Crowned': 'behemothbash', - }; - const ironHead = pokemon.baseMoves.indexOf('ironhead'); - if (ironHead >= 0) { - const move = this.dex.moves.get(behemothMove[rawSpecies.name]); - pokemon.baseMoveSlots[ironHead] = { - 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, - disabledSource: '', - used: false, - }; - pokemon.moveSlots = pokemon.baseMoveSlots.slice(); - } + this.singleEvent('BattleStart', this.dex.conditions.getByID(pokemon.species.id), pokemon.speciesState, pokemon); } this.format.onBattleStart?.call(this); @@ -125,9 +110,6 @@ export const Scripts: ModdedBattleScriptsData = { } } } - for (const pokemon of this.getAllPokemon()) { - this.singleEvent('Start', this.dex.conditions.getByID(pokemon.species.id), pokemon.speciesState, pokemon); - } this.midTurn = true; break; } @@ -141,8 +123,9 @@ export const Scripts: ModdedBattleScriptsData = { // @ts-expect-error modded const linkedMoves: ActiveMove[] = action.linked; for (let i = linkedMoves.length - 1; i >= 0; i--) { - const validTarget = this.validTargetLoc(action.targetLoc, action.pokemon, linkedMoves[i].target); - const targetLoc = validTarget ? action.targetLoc : 0; + const isValidTarget = this.validTargetLoc(action.targetLoc, action.pokemon, linkedMoves[i].target); + const randomTarget = this.getRandomTarget(action.pokemon, linkedMoves[i]); + const targetLoc = isValidTarget || !randomTarget ? action.targetLoc : action.pokemon.getLocOf(randomTarget); const pseudoAction: Action = { choice: 'move', priority: action.priority, speed: action.speed, pokemon: action.pokemon, targetLoc, moveid: linkedMoves[i].id, move: linkedMoves[i], mega: action.mega, @@ -160,12 +143,21 @@ export const Scripts: ModdedBattleScriptsData = { case 'megaEvo': this.actions.runMegaEvo(action.pokemon); break; + case 'megaEvoX': + this.actions.runMegaEvoX?.(action.pokemon); + break; + case 'megaEvoY': + this.actions.runMegaEvoY?.(action.pokemon); + break; case 'runDynamax': action.pokemon.addVolatile('dynamax'); action.pokemon.side.dynamaxUsed = true; if (action.pokemon.side.allySide) action.pokemon.side.allySide.dynamaxUsed = true; break; - case 'beforeTurnMove': { + case 'terastallize': + this.actions.terastallize(action.pokemon); + break; + case 'beforeTurnMove': if (!action.pokemon.isActive) return false; if (action.pokemon.fainted) return false; this.debug('before turn callback: ' + action.move.id); @@ -174,7 +166,13 @@ export const Scripts: ModdedBattleScriptsData = { if (!action.move.beforeTurnCallback) throw new Error(`beforeTurnMove has no beforeTurnCallback`); action.move.beforeTurnCallback.call(this, action.pokemon, target); break; - } + case 'priorityChargeMove': + if (!action.pokemon.isActive) return false; + if (action.pokemon.fainted) return false; + this.debug('priority charge callback: ' + action.move.id); + if (!action.move.priorityChargeCallback) throw new Error(`priorityChargeMove has no priorityChargeCallback`); + action.move.priorityChargeCallback.call(this, action.pokemon); + break; case 'event': this.runEvent(action.event!, action.pokemon); @@ -210,6 +208,24 @@ export const Scripts: ModdedBattleScriptsData = { } } break; + case 'revivalblessing': + action.pokemon.side.pokemonLeft++; + if (action.target.position < action.pokemon.side.active.length) { + this.queue.addChoice({ + choice: 'instaswitch', + pokemon: action.target, + target: action.target, + }); + } + action.target.fainted = false; + action.target.faintQueued = false; + action.target.subFainted = false; + action.target.status = ''; + action.target.hp = 1; // Needed so hp functions works + action.target.sethp(action.target.maxhp / 2); + this.add('-heal', action.target, action.target.getHealth, '[from] move: Revival Blessing'); + action.pokemon.side.removeSlotCondition(action.pokemon, 'revivalblessing'); + break; case 'runSwitch': this.actions.runSwitch(action.pokemon); break; @@ -228,7 +244,7 @@ export const Scripts: ModdedBattleScriptsData = { this.updateSpeed(); residualPokemon = this.getAllActive().map(pokemon => [pokemon, pokemon.getUndynamaxedHP()] as const); this.fieldEvent('Residual'); - this.add('upkeep'); + if (!this.ended) this.add('upkeep'); break; } @@ -255,7 +271,7 @@ export const Scripts: ModdedBattleScriptsData = { // in gen 3 or earlier, switching in fainted pokemon is done after // every move, rather than only at the end of the turn. this.checkFainted(); - } else if (action.choice === 'megaEvo' && this.gen === 7) { + } else if (['megaEvo', 'megaEvoX', 'megaEvoY'].includes(action.choice) && this.gen === 7) { this.eachEvent('Update'); // In Gen 7, the action order is recalculated for a Pokémon that mega evolves. for (const [i, queuedAction] of this.queue.list.entries()) { @@ -271,7 +287,7 @@ export const Scripts: ModdedBattleScriptsData = { return false; } - if (this.gen >= 5) { + if (this.gen >= 5 && action.choice !== 'start') { this.eachEvent('Update'); for (const [pokemon, originalHP] of residualPokemon) { const maxhp = pokemon.getUndynamaxedHP(pokemon.maxhp); @@ -293,14 +309,22 @@ export const Scripts: ModdedBattleScriptsData = { ); for (let i = 0; i < this.sides.length; i++) { + let reviveSwitch = false; // Used to ignore the fake switch for Revival Blessing if (switches[i] && !this.canSwitch(this.sides[i])) { for (const pokemon of this.sides[i].active) { + if (this.sides[i].slotConditions[pokemon.position]['revivalblessing']) { + reviveSwitch = true; + continue; + } pokemon.switchFlag = false; } - switches[i] = false; + if (!reviveSwitch) switches[i] = false; } else if (switches[i]) { for (const pokemon of this.sides[i].active) { - if (pokemon.switchFlag && !pokemon.skipBeforeSwitchOutEventFlag) { + if ( + pokemon.hp && pokemon.switchFlag && pokemon.switchFlag !== 'revivalblessing' && + !pokemon.skipBeforeSwitchOutEventFlag + ) { this.runEvent('BeforeSwitchOut', pokemon); pokemon.skipBeforeSwitchOutEventFlag = true; this.faintMessages(); // Pokemon may have fainted in BeforeSwitchOut @@ -322,7 +346,9 @@ export const Scripts: ModdedBattleScriptsData = { if (this.gen < 5) this.eachEvent('Update'); - if (this.gen >= 8 && this.queue.peek()?.choice === 'move') { + const nextAction = this.queue.peek(); + if (this.gen >= 8 && + (nextAction?.choice === 'move' || nextAction?.choice === 'runDynamax') && nextAction?.pokemon !== action.pokemon) { // In gen 8, speed is updated dynamically so update the queue's speed properties and sort it. this.updateSpeed(); for (const queueAction of this.queue.list) { @@ -333,6 +359,51 @@ export const Scripts: ModdedBattleScriptsData = { return false; }, + getTarget(pokemon, move, targetLoc, originalTarget) { + move = this.dex.moves.get(move); + + // Delete tracksTarget stuff because it's useless in Linked anyway + + // banning Dragon Darts from directly targeting itself is done in side.ts, but + // Dragon Darts can target itself if Ally Switch is used afterwards + if (move.smartTarget) { + const curTarget = pokemon.getAtLoc(targetLoc); + return curTarget && !curTarget.fainted ? curTarget : this.getRandomTarget(pokemon, move); + } + + // Fails if the target is the user and the move can't target its own position + const selfLoc = pokemon.getLocOf(pokemon); + if ( + ['adjacentAlly', 'any', 'normal'].includes(move.target) && targetLoc === selfLoc && + !pokemon.volatiles['twoturnmove'] && !pokemon.volatiles['iceball'] && !pokemon.volatiles['rollout'] + ) { + return move.flags['futuremove'] ? pokemon : null; + } + if (move.target !== 'randomNormal' && this.validTargetLoc(targetLoc, pokemon, move.target)) { + const target = pokemon.getAtLoc(targetLoc); + if (target?.fainted) { + if (this.gameType === 'freeforall') { + // Target is a fainted opponent in a free-for-all battle; attack shouldn't retarget + return target; + } + if (target.isAlly(pokemon)) { + if (move.target === 'adjacentAllyOrSelf' && this.gen !== 5) { + return pokemon; + } + // Target is a fainted ally: attack shouldn't retarget + return target; + } + } + if (target && !target.fainted) { + // Target is unfainted: use selected target location + return target; + } + + // Chosen target not valid, + // retarget randomly with getRandomTarget + } + return this.getRandomTarget(pokemon, move); + }, actions: { runMove(moveOrMoveName, pokemon, targetLoc, options) { pokemon.activeMoveActions++; @@ -369,15 +440,12 @@ export const Scripts: ModdedBattleScriptsData = { // THIS IS PURELY A SANITY CHECK // DO NOT TAKE ADVANTAGE OF THIS TO PREVENT A POKEMON FROM MOVING; // USE this.queue.cancelMove INSTEAD - this.debug(`${pokemon.id} INCONSISTENT STATE, ALREADY MOVED: ${pokemon.moveThisTurn}`); - this.clearActiveMove(true); + this.battle.debug(`${pokemon.id} INCONSISTENT STATE, ALREADY MOVED: ${pokemon.moveThisTurn}`); + this.battle.clearActiveMove(true); return; - } */ + } */ const willTryMove = this.battle.runEvent('BeforeMove', pokemon, target, move); if (!willTryMove) { - if (pokemon.volatiles['twoturnmove']?.move === move.id) { - pokemon.removeVolatile('twoturnmove'); - } this.battle.runEvent('MoveAborted', pokemon, target, move); this.battle.clearActiveMove(true); // The event 'BeforeMove' could have returned false or null @@ -386,6 +454,12 @@ export const Scripts: ModdedBattleScriptsData = { pokemon.moveThisTurnResult = willTryMove; return; } + + // Used exclusively for a hint later + if (move.flags['cantusetwice'] && pokemon.lastMove?.id === move.id) { + pokemon.addVolatile(move.id); + } + if (move.beforeMoveCallback) { if (move.beforeMoveCallback.call(this.battle, pokemon, target, move)) { this.battle.clearActiveMove(true); @@ -401,10 +475,6 @@ export const Scripts: ModdedBattleScriptsData = { if (!lockedMove) { if (!pokemon.deductPP(baseMove, null, target) && (move.id !== 'struggle')) { this.battle.add('cant', pokemon, 'nopp', move); - const gameConsole = [ - null, 'Game Boy', 'Game Boy Color', 'Game Boy Advance', 'DS', 'DS', '3DS', '3DS', - ][this.battle.gen] || 'Switch'; - this.battle.hint(`This is not a bug, this is really how it works on the ${gameConsole}; try it yourself if you don't believe us.`); this.battle.clearActiveMove(true); pokemon.moveThisTurnResult = false; return; @@ -417,7 +487,7 @@ export const Scripts: ModdedBattleScriptsData = { // Dancer Petal Dance hack // TODO: implement properly - const noLock = externalMove && !pokemon.volatiles.lockedmove; + const noLock = externalMove && !pokemon.volatiles['lockedmove']; if (zMove) { if (pokemon.illusion) { @@ -426,12 +496,19 @@ export const Scripts: ModdedBattleScriptsData = { this.battle.add('-zpower', pokemon); pokemon.side.zMoveUsed = true; } + + const oldActiveMove = move; + const moveDidSomething = this.useMove(baseMove, pokemon, { target, sourceEffect, zMove, maxMove }); this.battle.lastSuccessfulMoveThisTurn = moveDidSomething ? this.battle.activeMove && this.battle.activeMove.id : null; if (this.battle.activeMove) move = this.battle.activeMove; this.battle.singleEvent('AfterMove', move, null, pokemon, target, move); this.battle.runEvent('AfterMove', pokemon, target, move); + if (move.flags['cantusetwice'] && pokemon.removeVolatile(move.id)) { + this.battle.add('-hint', `Some effects can force a Pokemon to use ${move.name} again in a row.`); + } + // TODO: Refactor to use BattleQueue#prioritizeAction in onAnyAfterMove handlers // Dancer's activation order is completely different from any other event, so it's handled separately if (move.flags['dance'] && moveDidSomething && !move.isExternal) { const dancers = []; @@ -445,20 +522,29 @@ export const Scripts: ModdedBattleScriptsData = { // Note that the speed stat used is after any volatile replacements like Speed Swap, // but before any multipliers like Agility or Choice Scarf // Ties go to whichever Pokemon has had the ability for the least amount of time - dancers.sort((a, b) => -(b.storedStats['spe'] - a.storedStats['spe']) || - b.abilityState.effectOrder - a.abilityState.effectOrder); + dancers.sort( + (a, b) => -(b.storedStats['spe'] - a.storedStats['spe']) || b.abilityState.effectOrder - a.abilityState.effectOrder + ); + const targetOf1stDance = this.battle.activeTarget!; for (const dancer of dancers) { if (this.battle.faintMessages()) break; if (dancer.fainted) continue; this.battle.add('-activate', dancer, 'ability: Dancer'); - const dancersTarget = !target!.isAlly(dancer) && pokemon.isAlly(dancer) ? target! : pokemon; - this.runMove(move.id, dancer, dancer.getLocOf(dancersTarget), - { sourceEffect: this.dex.abilities.get('dancer'), externalMove: true }); + const dancersTarget = !targetOf1stDance.isAlly(dancer) && pokemon.isAlly(dancer) ? + targetOf1stDance : + pokemon; + const dancersTargetLoc = dancer.getLocOf(dancersTarget); + this.runMove(move.id, dancer, dancersTargetLoc, { sourceEffect: this.dex.abilities.get('dancer'), externalMove: true }); } } if (noLock && pokemon.volatiles['lockedmove']) delete pokemon.volatiles['lockedmove']; this.battle.faintMessages(); this.battle.checkWin(); + + if (this.battle.gen <= 4) { + // In gen 4, the outermost move is considered the last move for Copycat + this.battle.activeMove = oldActiveMove; + } }, }, queue: { @@ -476,13 +562,16 @@ export const Scripts: ModdedBattleScriptsData = { instaswitch: 3, beforeTurn: 4, beforeTurnMove: 5, + revivalblessing: 6, - runUnnerve: 100, runSwitch: 101, - // runPrimal: 102, (deprecated) switch: 103, megaEvo: 104, + megaEvoX: 104, + megaEvoY: 104, runDynamax: 105, + terastallize: 106, + priorityChargeMove: 107, shift: 200, // default is 200 (for moves) @@ -511,23 +600,49 @@ export const Scripts: ModdedBattleScriptsData = { pokemon: action.pokemon, })); } + if (action.megax && !action.pokemon.isSkyDropped()) { + actions.unshift(...this.resolveAction({ + choice: 'megaEvoX', + pokemon: action.pokemon, + })); + } + if (action.megay && !action.pokemon.isSkyDropped()) { + actions.unshift(...this.resolveAction({ + choice: 'megaEvoY', + pokemon: action.pokemon, + })); + } + if (action.terastallize && !action.pokemon.terastallized) { + actions.unshift(...this.resolveAction({ + choice: 'terastallize', + pokemon: action.pokemon, + })); + } if (action.maxMove && !action.pokemon.volatiles['dynamax']) { actions.unshift(...this.resolveAction({ choice: 'runDynamax', pokemon: action.pokemon, })); } + if (!action.maxMove && !action.zmove && action.move.priorityChargeCallback) { + actions.unshift(...this.resolveAction({ + choice: 'priorityChargeMove', + pokemon: action.pokemon, + move: action.move, + })); + } action.fractionalPriority = this.battle.runEvent('FractionalPriority', action.pokemon, null, action.move, 0); - const linkedMoves: [string, string] = action.pokemon.getLinkedMoves(); + const linkedMoves: [ActiveMove, ActiveMove] = action.pokemon.getLinkedMoves(); if ( linkedMoves.length && - !(action.pokemon.getItem().isChoice || action.pokemon.hasAbility('gorillatactics')) && + !action.pokemon.getWillLockMove!() && + !action.pokemon.getIsMoveLocked!() && !action.zmove && !action.maxMove ) { const decisionMove = this.battle.toID(action.move); - if (linkedMoves.includes(decisionMove)) { - action.linked = linkedMoves.map(moveid => this.battle.dex.getActiveMove(moveid)); - const linkedOtherMove = action.linked[1 - linkedMoves.indexOf(decisionMove)]; + if (linkedMoves.some(x => x.id === decisionMove)) { + action.linked = linkedMoves; + const linkedOtherMove = action.linked[1 - linkedMoves.findIndex(x => x.id === decisionMove)]; if (linkedOtherMove.beforeTurnCallback) { this.addChoice({ choice: 'beforeTurnMove', @@ -536,6 +651,14 @@ export const Scripts: ModdedBattleScriptsData = { targetLoc: action.targetLoc, }); } + if (linkedOtherMove.priorityChargeCallback) { + this.addChoice({ + choice: 'priorityChargeMove', + pokemon: action.pokemon, + move: linkedOtherMove, + targetLoc: action.targetLoc, + }); + } } } } else if (['switch', 'instaswitch'].includes(action.choice)) { @@ -564,7 +687,6 @@ export const Scripts: ModdedBattleScriptsData = { }, pokemon: { moveUsed(move, targetLoc) { - if (!this.moveThisTurn) this.m.lastMoveAbsolute = move; this.lastMove = move; this.moveThisTurn = move.id; this.lastMoveTargetLoc = targetLoc; @@ -572,20 +694,39 @@ export const Scripts: ModdedBattleScriptsData = { getLinkedMoves(ignoreDisabled) { const linkedMoves = this.moveSlots.slice(0, 2); if (linkedMoves.length !== 2 || linkedMoves[0].pp <= 0 || linkedMoves[1].pp <= 0) return []; - const ret = [linkedMoves[0].id, linkedMoves[1].id]; + const ret: [ActiveMove, ActiveMove] = [ + this.battle.dex.getActiveMove(linkedMoves[0].id), this.battle.dex.getActiveMove(linkedMoves[1].id), + ]; if (ignoreDisabled) return ret; - if (!this.ateBerry && ret.includes('belch' as ID)) return []; - if (this.hasItem('assaultvest') && - (this.battle.dex.moves.get(ret[0]).category === 'Status' || this.battle.dex.moves.get(ret[1]).category === 'Status')) { + if (!this.ateBerry && ret.some(x => x.id === 'belch')) return []; + if (this.hasItem('assaultvest') && (ret[0].category === 'Status' || ret[1].category === 'Status')) { return []; } return ret; }, - hasLinkedMove(moveid) { + hasLinkedMove(move) { // @ts-expect-error modded - const linkedMoves: ID[] = this.getLinkedMoves(true); + const linkedMoves: [ActiveMove, ActiveMove] = this.getLinkedMoves!(true); if (!linkedMoves.length) return false; - return linkedMoves.some(x => x === moveid); + return linkedMoves.some(x => x.id === move.id); + }, + getIsMoveLocked() { + // Detects active Outrage. + return !!this.volatiles['choicelock'] || !!this.volatiles['lockedmove']; + }, + getWillLockMove() { + // Ignores Outrage, etc, since they can miss. + return this.hasItem(['choiceband', 'choicescarf', 'choicespecs']) || this.hasAbility('gorillatactics'); + }, + getCanLinkMove(move) { + // @ts-expect-error modded + return !move.isZ && !move.isMax && !this.getWillLockMove() && !this.getIsMoveLocked(); + }, + queryLinkMove(move, ignoreDisabled) { + // @ts-expect-error modded + const linkedMoves: [ActiveMove, ActiveMove] = this.getLinkedMoves!(ignoreDisabled); + if (!linkedMoves.length) return { linkIndex: -1, linkedMoves }; + return { linkIndex: linkedMoves.findIndex(x => x.id === move.id), linkedMoves }; }, }, }; diff --git a/data/mods/mixandmega/scripts.ts b/data/mods/mixandmega/scripts.ts index 78d85cce0b..8c59398f4e 100644 --- a/data/mods/mixandmega/scripts.ts +++ b/data/mods/mixandmega/scripts.ts @@ -1,14 +1,20 @@ export const Scripts: ModdedBattleScriptsData = { gen: 9, init() { + this.modData('Abilities', 'dragonize').isNonstandard = null; + this.modData('Abilities', 'megasol').isNonstandard = null; + this.modData('Abilities', 'piercingdrill').isNonstandard = null; + this.modData('Abilities', 'spicyspray').isNonstandard = null; for (const i in this.data.Items) { const item = this.data.Items[i]; 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() { @@ -121,14 +127,15 @@ export const Scripts: ModdedBattleScriptsData = { const behemothMove: { [k: string]: string } = { 'Rusted Sword': 'behemothblade', 'Rusted Shield': 'behemothbash', }; - const ironHead = pokemon.baseMoves.indexOf('ironhead'); - if (ironHead >= 0) { + const ironHeadIndex = pokemon.baseMoves.indexOf('ironhead'); + if (ironHeadIndex >= 0) { const move = this.dex.moves.get(behemothMove[pokemon.getItem().name]); - pokemon.baseMoveSlots[ironHead] = { + const pp = this.calculatePP(move, pokemon.ppUps[ironHeadIndex]); + pokemon.baseMoveSlots[ironHeadIndex] = { move: move.name, id: move.id, - pp: move.noPPBoosts ? move.pp : move.pp * 8 / 5, - maxpp: move.noPPBoosts ? move.pp : move.pp * 8 / 5, + pp, + maxpp: pp, target: move.target, disabled: false, disabledSource: '', @@ -385,12 +392,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/monkeyspaw/scripts.ts b/data/mods/monkeyspaw/scripts.ts index ce494c72bd..86a484e7ae 100644 --- a/data/mods/monkeyspaw/scripts.ts +++ b/data/mods/monkeyspaw/scripts.ts @@ -193,40 +193,8 @@ export const Scripts: ModdedBattleScriptsData = { this.add('start'); - // Change Zacian/Zamazenta into their Crowned formes for (const pokemon of this.getAllPokemon()) { - let rawSpecies: Species | null = null; - if (pokemon.species.id === 'zacian' && pokemon.item === 'rustedsword') { - rawSpecies = this.dex.species.get('Zacian-Crowned'); - } else if (pokemon.species.id === 'zamazenta' && pokemon.item === 'rustedshield') { - rawSpecies = this.dex.species.get('Zamazenta-Crowned'); - } - if (!rawSpecies) continue; - const species = pokemon.setSpecies(rawSpecies); - if (!species) continue; - pokemon.baseSpecies = rawSpecies; - pokemon.details = pokemon.getUpdatedDetails(); - pokemon.setAbility(species.abilities['0'], null, null, true); - pokemon.baseAbility = pokemon.ability; - - const behemothMove: { [k: string]: string } = { - 'Zacian-Crowned': 'behemothblade', 'Zamazenta-Crowned': 'behemothbash', - }; - const ironHead = pokemon.baseMoves.indexOf('ironhead'); - if (ironHead >= 0) { - const move = this.dex.moves.get(behemothMove[rawSpecies.name]); - pokemon.baseMoveSlots[ironHead] = { - 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, - disabledSource: '', - used: false, - }; - pokemon.moveSlots = pokemon.baseMoveSlots.slice(); - } + this.singleEvent('BattleStart', this.dex.conditions.getByID(pokemon.species.id), pokemon.speciesState, pokemon); } this.format.onBattleStart?.call(this); @@ -248,9 +216,6 @@ export const Scripts: ModdedBattleScriptsData = { } } } - for (const pokemon of this.getAllPokemon()) { - this.singleEvent('Start', this.dex.conditions.getByID(pokemon.species.id), pokemon.speciesState, pokemon); - } this.midTurn = true; break; } diff --git a/data/mods/partnersincrime/scripts.ts b/data/mods/partnersincrime/scripts.ts index 51a35b323d..c6ffe18a44 100644 --- a/data/mods/partnersincrime/scripts.ts +++ b/data/mods/partnersincrime/scripts.ts @@ -407,17 +407,18 @@ export const Scripts: ModdedBattleScriptsData = { this.hpType = (this.battle.gen >= 5 ? this.hpType : pokemon.hpType); this.hpPower = (this.battle.gen >= 5 ? this.hpPower : pokemon.hpPower); this.timesAttacked = pokemon.timesAttacked; - for (const moveSlot of pokemon.moveSlots) { + for (const [i, moveSlot] of pokemon.moveSlots.entries()) { let moveName = moveSlot.move; - if (!pokemon.m.curMoves.includes(moveSlot.id)) continue; if (moveSlot.id === 'hiddenpower') { moveName = 'Hidden Power ' + this.hpType; } + const move = this.battle.dex.moves.get(moveSlot.id); + const pp = Math.min(5, move.pp); this.moveSlots.push({ move: moveName, id: moveSlot.id, - pp: moveSlot.maxpp === 1 ? 1 : 5, - maxpp: this.battle.gen >= 5 ? (moveSlot.maxpp === 1 ? 1 : 5) : moveSlot.maxpp, + pp, + maxpp: this.battle.gen >= 5 ? pp : this.battle.calculatePP(move, this.ppUps[i] || 0), target: moveSlot.target, disabled: false, used: false, diff --git a/data/mods/passiveaggressive/moves.ts b/data/mods/passiveaggressive/moves.ts index 78a2f7408a..aaab74a98e 100644 --- a/data/mods/passiveaggressive/moves.ts +++ b/data/mods/passiveaggressive/moves.ts @@ -215,11 +215,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { }, onTryHitPriority: 3, onTryHit(target, source, move) { - if (!move.flags['protect']) { - if (['gmaxoneblow', 'gmaxrapidflow'].includes(move.id)) return; - if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true; - return; - } + if (this.checkMoveBypassesProtect(move, source, target)) return; if (move.smartTarget) { move.smartTarget = false; } else { diff --git a/data/mods/pokebilities/abilities.ts b/data/mods/pokebilities/abilities.ts index 6b8574d196..33b7a31fbe 100644 --- a/data/mods/pokebilities/abilities.ts +++ b/data/mods/pokebilities/abilities.ts @@ -41,14 +41,24 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa onSwitchIn(pokemon) { this.add('-ability', pokemon, 'Neutralizing Gas'); pokemon.abilityState.ending = false; + const strongWeathers = ['desolateland', 'primordialsea', 'deltastream']; // Remove setter's innates before the ability starts - if (pokemon.m.innates) { + if (pokemon.m.innates && !pokemon.hasItem('Ability Shield')) { for (const innate of pokemon.m.innates) { if (this.dex.abilities.get(innate).flags['cantsuppress'] || innate === 'neutralizinggas') continue; pokemon.removeVolatile('ability:' + innate); } } for (const target of this.getAllActive()) { + if (target === pokemon) continue; + if (target.hasItem('Ability Shield')) { + this.add('-block', target, 'item: Ability Shield'); + continue; + } + // Can't suppress a Tatsugiri inside of Dondozo already + if (target.volatiles['commanding']) { + continue; + } if (target.illusion) { this.singleEvent('End', this.dex.abilities.get('Illusion'), target.abilityState, target, pokemon, 'neutralizinggas'); } @@ -56,6 +66,9 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa delete target.volatiles['slowstart']; this.add('-end', target, 'Slow Start', '[silent]'); } + if (strongWeathers.includes(target.getAbility().id)) { + this.singleEvent('End', this.dex.abilities.get(target.getAbility().id), target.abilityState, target, pokemon, 'neutralizinggas'); + } if (target.m.innates) { for (const innate of target.m.innates) { if (this.dex.abilities.get(innate).flags['cantsuppress']) continue; @@ -65,6 +78,12 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa } }, onEnd(source) { + if (source.transformed) return; + for (const pokemon of this.getAllActive()) { + if (pokemon !== source && pokemon.hasAbility('Neutralizing Gas')) { + return; + } + } this.add('-end', source, 'ability: Neutralizing Gas'); // FIXME this happens before the pokemon switches out, should be the opposite order. @@ -79,12 +98,19 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa this.speedSort(sortedActive); for (const pokemon of sortedActive) { if (pokemon !== source) { + if (pokemon.getAbility().flags['cantsuppress']) continue; // does not interact with e.g Ice Face, Zen Mode + if (pokemon.hasItem('abilityshield')) continue; // don't restart abilities that weren't suppressed + // Will be suppressed by Pokemon#ignoringAbility if needed this.singleEvent('Start', pokemon.getAbility(), pokemon.abilityState, pokemon); + if (pokemon.ability === "gluttony") { + pokemon.abilityState.gluttony = false; + } if (pokemon.m.innates) { for (const innate of pokemon.m.innates) { // permanent abilities if (pokemon.volatiles['ability:' + innate]) continue; + if (innate === "gluttony") pokemon.abilityState.gluttony = false; pokemon.addVolatile('ability:' + innate, pokemon); } } diff --git a/data/mods/pokebilities/scripts.ts b/data/mods/pokebilities/scripts.ts index 45da0faf92..c535547337 100644 --- a/data/mods/pokebilities/scripts.ts +++ b/data/mods/pokebilities/scripts.ts @@ -14,27 +14,26 @@ export const Scripts: ModdedBattleScriptsData = { }, pokemon: { ignoringAbility() { + if (this.battle.gen >= 5 && !this.isActive) return true; + + // Certain Abilities won't activate while Transformed, even if they ordinarily couldn't be suppressed (e.g. Disguise) + if (this.getAbility().flags['notransform'] && this.transformed) return true; + if (this.getAbility().flags['cantsuppress']) return false; + if (this.volatiles['gastroacid']) return true; + // Check if any active pokemon have the ability Neutralizing Gas - let neutralizinggas = false; + if (this.hasItem('Ability Shield') || this.m.innates?.includes('neutralizinggas') || + this.ability === ('neutralizinggas' as ID)) return false; for (const pokemon of this.battle.getAllActive()) { // can't use hasAbility because it would lead to infinite recursion - if ( - (pokemon.ability === ('neutralizinggas' as ID) || pokemon.m.innates?.some((k: string) => k === 'neutralizinggas')) && - !pokemon.volatiles['gastroacid'] && !pokemon.abilityState.ending - ) { - neutralizinggas = true; - break; + if ((pokemon.m.innates?.includes('neutralizinggas') || pokemon.ability === ('neutralizinggas' as ID)) && + !pokemon.volatiles['gastroacid'] && !pokemon.transformed && + !pokemon.abilityState.ending && !this.volatiles['commanding']) { + return true; } } - return !!( - (this.battle.gen >= 5 && !this.isActive) || - ((this.volatiles['gastroacid'] || - (neutralizinggas && (this.ability !== ('neutralizinggas' as ID) || - this.m.innates?.some((k: string) => k === 'neutralizinggas')) - )) && !this.getAbility().flags['cantsuppress'] - ) - ); + return false; }, hasAbility(ability) { if (this.ignoringAbility()) return false; @@ -71,16 +70,18 @@ export const Scripts: ModdedBattleScriptsData = { this.hpType = (this.battle.gen >= 5 ? this.hpType : pokemon.hpType); this.hpPower = (this.battle.gen >= 5 ? this.hpPower : pokemon.hpPower); this.timesAttacked = pokemon.timesAttacked; - for (const moveSlot of pokemon.moveSlots) { + for (const [i, moveSlot] of pokemon.moveSlots.entries()) { let moveName = moveSlot.move; if (moveSlot.id === 'hiddenpower') { moveName = 'Hidden Power ' + this.hpType; } + const move = this.battle.dex.moves.get(moveSlot.id); + const pp = Math.min(5, move.pp); this.moveSlots.push({ move: moveName, id: moveSlot.id, - pp: moveSlot.maxpp === 1 ? 1 : 5, - maxpp: this.battle.gen >= 5 ? (moveSlot.maxpp === 1 ? 1 : 5) : moveSlot.maxpp, + pp, + maxpp: this.battle.gen >= 5 ? pp : this.battle.calculatePP(move, this.ppUps[i] || 0), target: moveSlot.target, disabled: false, used: 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 3b253d0eff..0000000000 --- a/data/mods/scootopiav2/typechart.ts +++ /dev/null @@ -1,530 +0,0 @@ -export const TypeChart: import('../../../sim/dex-data').ModdedTypeDataTable = { - bug: { - 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: { - 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: { - 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: { - 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: { - 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: { - 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: { - 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: { - 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: { - 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: { - 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: { - 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: { - 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: { - 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: { - 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: { - 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: { - 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: { - 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: { - 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: { - 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: { - 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/teraoverride/moves.ts b/data/mods/teraoverride/moves.ts index 90955d4d5c..5e8175440b 100644 --- a/data/mods/teraoverride/moves.ts +++ b/data/mods/teraoverride/moves.ts @@ -574,7 +574,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { if (!target.isGrounded()) { const baseMove = this.dex.moves.get(effect.id); if (baseMove.priority > 0) { - this.hint("Psychic Terrain doesn't affect Pokémon immune to Ground."); + this.hint("Psychic Terrain doesn't affect airborne Pokémon."); } return; } diff --git a/data/mods/trademarked/scripts.ts b/data/mods/trademarked/scripts.ts index a33c7ff4f0..ea46643879 100644 --- a/data/mods/trademarked/scripts.ts +++ b/data/mods/trademarked/scripts.ts @@ -251,16 +251,18 @@ export const Scripts: ModdedBattleScriptsData = { this.hpType = (this.battle.gen >= 5 ? this.hpType : pokemon.hpType); this.hpPower = (this.battle.gen >= 5 ? this.hpPower : pokemon.hpPower); this.timesAttacked = pokemon.timesAttacked; - for (const moveSlot of pokemon.moveSlots) { + for (const [i, moveSlot] of pokemon.moveSlots.entries()) { let moveName = moveSlot.move; if (moveSlot.id === 'hiddenpower') { moveName = 'Hidden Power ' + this.hpType; } + const move = this.battle.dex.moves.get(moveSlot.id); + const pp = Math.min(5, move.pp); this.moveSlots.push({ move: moveName, id: moveSlot.id, - pp: moveSlot.maxpp === 1 ? 1 : 5, - maxpp: this.battle.gen >= 5 ? (moveSlot.maxpp === 1 ? 1 : 5) : moveSlot.maxpp, + pp, + maxpp: this.battle.gen >= 5 ? pp : this.battle.calculatePP(move, this.ppUps[i] || 0), target: moveSlot.target, disabled: false, used: false, diff --git a/data/moves.ts b/data/moves.ts index 596b099ca2..c112adabf7 100644 --- a/data/moves.ts +++ b/data/moves.ts @@ -13,7 +13,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: {}, isZ: "pikashuniumz", critRatio: 3, - secondary: null, target: "normal", type: "Electric", contestType: "Cool", @@ -28,7 +27,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, heal: 1, metronome: 1 }, drain: [1, 2], - secondary: null, target: "normal", type: "Grass", contestType: "Clever", @@ -42,7 +40,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 1, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Rock", contestType: "Cool", @@ -78,7 +75,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { def: 2, }, - secondary: null, target: "self", type: "Poison", zMove: { effect: 'clearnegativeboost' }, @@ -95,7 +91,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "poisoniumz", - secondary: null, target: "normal", type: "Poison", contestType: "Cool", @@ -135,7 +130,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, distance: 1, metronome: 1 }, - secondary: null, target: "any", type: "Flying", contestType: "Cool", @@ -166,7 +160,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return false; } }, - secondary: null, target: "adjacentAllyOrSelf", type: "Normal", zMove: { effect: 'crit2' }, @@ -181,7 +174,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, distance: 1, metronome: 1, slicing: 1 }, - secondary: null, target: "any", type: "Flying", contestType: "Cool", @@ -196,7 +188,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, distance: 1, metronome: 1, wind: 1 }, critRatio: 2, - secondary: null, target: "any", type: "Flying", contestType: "Cool", @@ -220,7 +211,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return false; } }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { spe: 1 } }, @@ -238,7 +228,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { spe: 2, }, - secondary: null, target: "self", type: "Psychic", zMove: { effect: 'clearnegativeboost' }, @@ -254,7 +243,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1, slicing: 1, wind: 1 }, critRatio: 2, - secondary: null, target: "allAdjacentFoes", type: "Flying", contestType: "Cool", @@ -287,7 +275,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "fightiniumz", - secondary: null, target: "normal", type: "Fighting", contestType: "Cool", @@ -364,7 +351,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.effectState.duration = 2; }, }, - secondary: null, target: "self", type: "Psychic", zMove: { boost: { spe: 2 } }, @@ -382,7 +368,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { spd: 2, }, - secondary: null, target: "self", type: "Psychic", zMove: { effect: 'clearnegativeboost' }, @@ -461,7 +446,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1, slicing: 1 }, critRatio: 2, - secondary: null, target: "normal", type: "Water", contestType: "Cool", @@ -475,7 +459,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 1, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Water", contestType: "Cool", @@ -499,7 +482,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.heal(pokemon.baseMaxhp / 16); }, }, - secondary: null, target: "self", type: "Water", zMove: { boost: { def: 1 } }, @@ -535,7 +517,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Water", contestType: "Beautiful", @@ -555,7 +536,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spd: -1, }, }, - secondary: null, target: "normal", type: "Fire", }, @@ -569,7 +549,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, multihit: [2, 5], - secondary: null, target: "normal", type: "Fighting", contestType: "Tough", @@ -621,7 +600,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { spd: 1, }, - secondary: null, target: "adjacentAlly", type: "Fairy", zMove: { boost: { spd: 2 } }, @@ -658,7 +636,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.actions.useMove(randomMove, target); }, callsMove: true, - secondary: null, target: "self", type: "Normal", contestType: "Cute", @@ -679,7 +656,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Dark", contestType: "Clever", @@ -710,7 +686,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "allAdjacentFoes", type: "Ghost", }, @@ -724,7 +699,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, critRatio: 2, - secondary: null, target: "normal", type: "Bug", contestType: "Clever", @@ -780,7 +754,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onTryImmunity(target, source) { return (target.gender === 'M' && source.gender === 'F') || (target.gender === 'F' && source.gender === 'M'); }, - secondary: null, target: "normal", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -795,7 +768,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { protect: 1, mirror: 1, distance: 1, metronome: 1, bullet: 1, pulse: 1 }, - secondary: null, target: "any", type: "Fighting", contestType: "Beautiful", @@ -898,7 +870,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-sideend', side, 'move: Aurora Veil'); }, }, - secondary: null, target: "allySide", type: "Ice", zMove: { boost: { spe: 1 } }, @@ -929,7 +900,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-start', pokemon, 'Autotomize'); } }, - secondary: null, target: "self", type: "Steel", zMove: { effect: 'clearnegativeboost' }, @@ -954,7 +924,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: -4, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Ice", contestType: "Beautiful", @@ -991,7 +960,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { atk: -1, }, - secondary: null, target: "normal", type: "Fairy", zMove: { boost: { def: 1 } }, @@ -1010,7 +978,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { self: { sideCondition: 'reflect', }, - secondary: null, target: "normal", type: "Dark", contestType: "Clever", @@ -1039,11 +1006,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { }, onTryHitPriority: 3, onTryHit(target, source, move) { - if (!move.flags['protect']) { - if (['gmaxoneblow', 'gmaxrapidflow'].includes(move.id)) return; - if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true; - return; - } + if (this.checkMoveBypassesProtect(move, source, target)) return; if (move.smartTarget) { move.smartTarget = false; } else { @@ -1067,7 +1030,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "self", type: "Poison", zMove: { boost: { def: 1 } }, @@ -1105,7 +1067,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1, bullet: 1 }, multihit: [2, 5], - secondary: null, target: "normal", type: "Normal", contestType: "Cute", @@ -1123,7 +1084,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { def: 2, }, - secondary: null, target: "self", type: "Psychic", zMove: { effect: 'clearnegativeboost' }, @@ -1151,7 +1111,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { }, }, selfSwitch: 'copyvolatile', - secondary: null, target: "self", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -1184,7 +1143,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onAfterMove(pokemon) { pokemon.removeVolatile('beakblast'); }, - secondary: null, target: "normal", type: "Flying", contestType: "Tough", @@ -1208,7 +1166,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { move.allies = pokemon.side.pokemon.filter(ally => ally === pokemon || !ally.fainted && !ally.status); move.multihit = move.allies.length; }, - secondary: null, target: "normal", type: "Dark", contestType: "Clever", @@ -1222,7 +1179,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, failcopycat: 1, failmimic: 1 }, - secondary: null, target: "normal", type: "Steel", }, @@ -1235,7 +1191,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, failcopycat: 1, failmimic: 1, slicing: 1 }, - secondary: null, target: "normal", type: "Steel", }, @@ -1251,7 +1206,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onDisableMove(pokemon) { if (!pokemon.ateBerry) pokemon.disableMove('belch'); }, - secondary: null, target: "normal", type: "Poison", contestType: "Tough", @@ -1272,7 +1226,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.directDamage(target.maxhp / 2); this.boost({ atk: 12 }, target); }, - secondary: null, target: "self", type: "Normal", zMove: { effect: 'heal' }, @@ -1300,7 +1253,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } this.add('-item', target, myItem.name, '[from] move: Bestow', `[of] ${source}`); }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { spe: 2 } }, @@ -1375,7 +1327,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-end', pokemon, 'move: Bide', '[silent]'); }, }, - secondary: null, target: "self", type: "Normal", contestType: "Tough", @@ -1390,7 +1341,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, volatileStatus: 'partiallytrapped', - secondary: null, target: "normal", type: "Normal", contestType: "Tough", @@ -1422,7 +1372,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, heal: 1, metronome: 1, slicing: 1 }, drain: [1, 2], - secondary: null, target: "normal", type: "Fire", }, @@ -1455,7 +1404,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "darkiniumz", - secondary: null, target: "normal", type: "Dark", contestType: "Cool", @@ -1472,7 +1420,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { self: { volatileStatus: 'mustrecharge', }, - secondary: null, target: "normal", type: "Fire", contestType: "Beautiful", @@ -1570,7 +1517,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onHit(target, source, move) { return target.addVolatile('trapped', source, move, 'trapper'); }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { def: 1 } }, @@ -1585,7 +1531,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1, cantusetwice: 1 }, - secondary: null, target: "normal", type: "Normal", }, @@ -1600,7 +1545,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "grassiumz", - secondary: null, target: "normal", type: "Grass", contestType: "Cool", @@ -1632,7 +1576,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1 }, overrideOffensiveStat: 'def', - secondary: null, target: "normal", type: "Fighting", }, @@ -1644,7 +1587,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { name: "Body Slam", pp: 15, priority: 0, - flags: { contact: 1, protect: 1, mirror: 1, nonsky: 1, metronome: 1 }, + flags: { contact: 1, protect: 1, mirror: 1, nonsky: 1, metronome: 1, minimize: 1 }, secondary: { chance: 30, status: 'par', @@ -1671,7 +1614,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Electric", }, @@ -1721,7 +1663,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, multihit: 2, - secondary: null, target: "normal", type: "Ground", maxMove: { basePower: 130 }, @@ -1737,7 +1678,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, multihit: [2, 5], - secondary: null, target: "normal", type: "Ground", zMove: { basePower: 140 }, @@ -1753,7 +1693,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { protect: 1, mirror: 1, sound: 1, bypasssub: 1, metronome: 1 }, - secondary: null, target: "allAdjacent", type: "Normal", contestType: "Tough", @@ -1814,7 +1753,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, heal: 1 }, drain: [1, 2], - secondary: null, target: "normal", type: "Water", contestType: "Clever", @@ -1828,7 +1766,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 40, priority: 0, flags: { contact: 1, protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Grass", }, @@ -1842,7 +1779,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, distance: 1, metronome: 1 }, recoil: [33, 100], - secondary: null, target: "any", type: "Flying", contestType: "Cool", @@ -1876,7 +1812,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "normaliumz", - secondary: null, target: "normal", type: "Normal", contestType: "Cool", @@ -1896,7 +1831,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pokemon.side.removeSideCondition('lightscreen'); pokemon.side.removeSideCondition('auroraveil'); }, - secondary: null, target: "normal", type: "Fighting", contestType: "Cool", @@ -1915,7 +1849,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.chainModify(2); } }, - secondary: null, target: "normal", type: "Water", contestType: "Tough", @@ -1929,7 +1862,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "allAdjacent", type: "Dark", contestType: "Tough", @@ -1993,7 +1925,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (item.onEat) source.ateBerry = true; } }, - secondary: null, target: "normal", type: "Bug", contestType: "Cute", @@ -2030,7 +1961,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { atk: 1, def: 1, }, - secondary: null, target: "self", type: "Fighting", zMove: { boost: { atk: 1 } }, @@ -2064,7 +1994,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 30, priority: 1, flags: { contact: 1, protect: 1, mirror: 1, punch: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Steel", contestType: "Tough", @@ -2079,7 +2008,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1, bullet: 1 }, multihit: [2, 5], - secondary: null, target: "normal", type: "Grass", zMove: { basePower: 140 }, @@ -2110,11 +2038,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { }, onTryHitPriority: 3, onTryHit(target, source, move) { - if (!move.flags['protect'] || move.category === 'Status') { - if (['gmaxoneblow', 'gmaxrapidflow'].includes(move.id)) return; - if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true; - return; - } + if (this.checkMoveBypassesProtect(move, source, target, false)) return; if (move.smartTarget) { move.smartTarget = false; } else { @@ -2138,7 +2062,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "self", type: "Fire", }, @@ -2185,7 +2108,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-start', pokemon, 'typechange', pokemon.getTypes().join('/'), '[from] move: Burn Up'); }, }, - secondary: null, target: "normal", type: "Fire", contestType: "Clever", @@ -2221,7 +2143,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spa: 1, spd: 1, }, - secondary: null, target: "self", type: "Psychic", zMove: { effect: 'clearnegativeboost' }, @@ -2252,7 +2173,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (target.getTypes().join() === newType || !target.setType(newType)) return false; this.add('-start', target, 'typechange', newType); }, - secondary: null, target: "self", type: "Normal", zMove: { boost: { evasion: 1 } }, @@ -2274,7 +2194,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { spa: -2, }, - secondary: null, target: "allAdjacentFoes", type: "Normal", zMove: { boost: { spd: 2 } }, @@ -2291,7 +2210,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1 }, isZ: "pikaniumz", - secondary: null, target: "normal", type: "Electric", contestType: "Cool", @@ -2306,7 +2224,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, slicing: 1 }, onAfterHit(target, source, move) { - if (!move.hasSheerForce && source.hp) { + if (!move.hasSheerForce) { for (const side of source.side.foeSidesWithConditions()) { side.addSideCondition('spikes'); } @@ -2335,7 +2253,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onTryHit(target, source) { this.add('-activate', target, 'move: Celebrate'); }, - secondary: null, target: "self", type: "Normal", zMove: { boost: { atk: 1, def: 1, spa: 1, spd: 1, spe: 1 } }, @@ -2390,7 +2307,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { spd: 1, }, - secondary: null, target: "self", type: "Electric", zMove: { boost: { spd: 1 } }, @@ -2429,7 +2345,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { atk: -2, }, - secondary: null, target: "normal", type: "Fairy", zMove: { boost: { def: 1 } }, @@ -2489,7 +2404,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { }, weather: 'snowscape', selfSwitch: true, - secondary: null, condition: { duration: 1, onBeforeMovePriority: 100, @@ -2513,7 +2427,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, ignoreDefensive: true, ignoreEvasion: true, - secondary: null, target: "normal", type: "Normal", contestType: "Tough", @@ -2528,7 +2441,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, // Recoil implemented in battle-actions.ts - secondary: null, target: "normal", type: "Grass", }, @@ -2557,7 +2469,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, volatileStatus: 'partiallytrapped', - secondary: null, target: "normal", type: "Water", contestType: "Tough", @@ -2576,7 +2487,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { def: -1, }, }, - secondary: null, target: "allAdjacentFoes", type: "Dragon", contestType: "Tough", @@ -2607,7 +2517,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spd: 1, spe: 1, }, - secondary: null, target: "self", type: "Dragon", }, @@ -2651,7 +2560,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { target.clearBoosts(); this.add('-clearboost', target); }, - secondary: null, target: "normal", type: "Poison", contestType: "Beautiful", @@ -2671,7 +2579,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spd: -1, }, }, - secondary: null, target: "normal", type: "Fighting", contestType: "Tough", @@ -2685,7 +2592,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { bypasssub: 1, allyanim: 1, metronome: 1 }, - secondary: null, boosts: { atk: 1, def: 1, @@ -2707,7 +2613,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { def: 1, accuracy: 1, }, - secondary: null, target: "self", type: "Poison", zMove: { effect: 'clearnegativeboost' }, @@ -2729,7 +2634,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.chainModify([5461, 4096]); } }, - secondary: null, target: "normal", type: "Fighting", contestType: "Tough", @@ -2765,7 +2669,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, punch: 1, metronome: 1 }, multihit: [2, 5], - secondary: null, target: "normal", type: "Normal", maxMove: { basePower: 100 }, @@ -2797,7 +2700,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { targetRelayVar.target = this.getAtSlot(lastDamagedBy.slot); } }, - secondary: null, target: "scripted", type: "Dark", contestType: "Cool", @@ -2814,7 +2716,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { spa: -1, }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { spd: 1 } }, @@ -2830,7 +2731,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, reflectable: 1, mirror: 1, metronome: 1 }, volatileStatus: 'confusion', - secondary: null, target: "normal", type: "Ghost", zMove: { boost: { spa: 1 } }, @@ -2884,7 +2784,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "rockiumz", - secondary: null, target: "normal", type: "Rock", contestType: "Cool", @@ -2903,7 +2802,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (target.hasType(type) || !target.setType(type)) return false; this.add('-start', target, 'typechange', type); }, - secondary: null, target: "self", type: "Normal", zMove: { boost: { atk: 1, def: 1, spa: 1, spd: 1, spe: 1 } }, @@ -2939,7 +2837,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (!source.setType(randomType)) return false; this.add('-start', source, 'typechange', randomType); }, - secondary: null, target: "normal", type: "Normal", zMove: { effect: 'heal' }, @@ -2965,7 +2862,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.actions.useMove(move.id, pokemon); }, callsMove: true, - secondary: null, target: "self", type: "Normal", zMove: { boost: { accuracy: 1 } }, @@ -2991,7 +2887,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (target.newlySwitched || this.queue.willMove(target)) return; target.addVolatile('gastroacid'); }, - secondary: null, target: "allAdjacentFoes", type: "Dragon", zMove: { basePower: 140 }, @@ -3008,7 +2903,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "steeliumz", - secondary: null, target: "normal", type: "Steel", contestType: "Cool", @@ -3031,7 +2925,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-fail', target, 'move: Corrosive Gas'); } }, - secondary: null, target: "allAdjacent", type: "Poison", }, @@ -3048,7 +2941,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { def: 1, spd: 1, }, - secondary: null, target: "self", type: "Psychic", zMove: { boost: { spd: 1 } }, @@ -3066,7 +2958,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { def: 3, }, - secondary: null, target: "self", type: "Grass", zMove: { effect: 'clearnegativeboost' }, @@ -3084,7 +2975,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { spe: -2, }, - secondary: null, target: "allAdjacentFoes", type: "Grass", zMove: { effect: 'clearnegativeboost' }, @@ -3130,7 +3020,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "scripted", type: "Fighting", maxMove: { basePower: 75 }, @@ -3200,7 +3089,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-swapsideconditions'); this.add('-activate', source, 'move: Court Change'); }, - secondary: null, target: "all", type: "Normal", }, @@ -3230,7 +3118,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } this.add('-item', source, yourItem, '[from] move: Covet', `[of] ${target}`); }, - secondary: null, target: "normal", type: "Normal", contestType: "Cute", @@ -3245,7 +3132,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, critRatio: 2, - secondary: null, target: "normal", type: "Water", contestType: "Tough", @@ -3276,7 +3162,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.NOT_FAIL; }, }, - secondary: null, target: "allySide", type: "Fairy", zMove: { boost: { spd: 1 } }, @@ -3292,7 +3177,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, critRatio: 2, - secondary: null, target: "normal", type: "Fighting", contestType: "Cool", @@ -3369,7 +3253,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", zMove: { basePower: 190 }, @@ -3414,7 +3297,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.damage(pokemon.baseMaxhp / 4); }, }, - secondary: null, target: "normal", nonGhostTarget: "self", type: "Ghost", @@ -3431,7 +3313,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 30, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, slicing: 1 }, - secondary: null, target: "normal", type: "Normal", contestType: "Cool", @@ -3447,7 +3328,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, ignoreEvasion: true, ignoreDefensive: true, - secondary: null, target: "normal", type: "Dark", contestType: "Cool", @@ -3480,14 +3360,13 @@ 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'); this.hint("Only a Pokemon whose form is Darkrai can use this move."); return null; }, - secondary: null, target: "allAdjacentFoes", type: "Dark", zMove: { effect: 'clearnegativeboost' }, @@ -3502,7 +3381,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "allAdjacentFoes", type: "Fairy", contestType: "Beautiful", @@ -3516,7 +3394,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { allyanim: 1 }, - secondary: null, boosts: { atk: 2, spa: 2, @@ -3537,7 +3414,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { def: 1, spd: 1, }, - secondary: null, target: "self", type: "Bug", zMove: { boost: { def: 1 } }, @@ -3560,7 +3436,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { noCopy: true, onRestart: () => null, }, - secondary: null, target: "self", type: "Normal", zMove: { boost: { accuracy: 1 } }, @@ -3596,7 +3471,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.field.clearTerrain(); return success; }, - secondary: null, target: "normal", type: "Flying", zMove: { boost: { accuracy: 1 } }, @@ -3641,7 +3515,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pokemon.removeVolatile('destinybond'); }, }, - secondary: null, target: "self", type: "Ghost", zMove: { effect: 'redirect' }, @@ -3664,7 +3537,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onHit(pokemon) { pokemon.addVolatile('stall'); }, - secondary: null, target: "self", type: "Fighting", zMove: { boost: { evasion: 1 } }, @@ -3681,7 +3553,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "dragoniumz", - secondary: null, target: "normal", type: "Dragon", contestType: "Cool", @@ -3748,7 +3619,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "normal", type: "Ground", contestType: "Tough", @@ -3765,14 +3635,8 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { secondary: { chance: 50, onHit(target, source) { - const result = this.random(3); - if (result === 0) { - target.trySetStatus('psn', source); - } else if (result === 1) { - target.trySetStatus('par', source); - } else { - target.trySetStatus('slp', source); - } + const status = this.sample(['psn', 'par', 'slp']); + target.trySetStatus(status, source); }, }, target: "normal", @@ -3842,7 +3706,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "normal", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -3857,7 +3720,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1, sound: 1, bypasssub: 1, metronome: 1 }, - secondary: null, target: "allAdjacentFoes", type: "Fairy", contestType: "Cute", @@ -3923,7 +3785,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "normal", type: "Water", contestType: "Beautiful", @@ -3976,7 +3837,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.NOT_FAIL; } }, - secondary: null, target: "adjacentFoe", type: "Normal", }, @@ -4009,7 +3869,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-start', source, 'Doom Desire'); return this.NOT_FAIL; }, - secondary: null, target: "normal", type: "Steel", contestType: "Beautiful", @@ -4024,7 +3883,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, recoil: [33, 100], - secondary: null, target: "normal", type: "Normal", contestType: "Tough", @@ -4039,7 +3897,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, multihit: 2, - secondary: null, target: "normal", type: "Normal", zMove: { basePower: 140 }, @@ -4077,7 +3934,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, multihit: 2, - secondary: null, target: "normal", type: "Fighting", maxMove: { basePower: 80 }, @@ -4104,7 +3960,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-start', pokemon, 'typechange', pokemon.getTypes().join('/'), '[from] move: Double Shock'); }, }, - secondary: null, target: "normal", type: "Electric", contestType: "Clever", @@ -4120,7 +3975,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, multihit: [2, 5], - secondary: null, target: "normal", type: "Normal", contestType: "Cute", @@ -4137,7 +3991,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { evasion: 1, }, - secondary: null, target: "self", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -4157,7 +4010,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spa: -2, }, }, - secondary: null, target: "normal", type: "Dragon", contestType: "Beautiful", @@ -4226,7 +4078,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return critRatio + (this.effectState.hasDragonType ? 2 : 1); }, }, - secondary: null, target: "adjacentAlly", type: "Dragon", }, @@ -4239,7 +4090,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Dragon", contestType: "Cool", @@ -4257,7 +4107,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { atk: 1, spe: 1, }, - secondary: null, target: "self", type: "Dragon", zMove: { effect: 'clearnegativeboost' }, @@ -4274,7 +4123,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: { protect: 1, mirror: 1, metronome: 1, noparentalbond: 1 }, multihit: 2, smartTarget: true, - secondary: null, target: "normal", type: "Dragon", maxMove: { basePower: 130 }, @@ -4293,7 +4141,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "allAdjacentFoes", type: "Dragon", }, @@ -4306,7 +4153,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Dragon", contestType: "Tough", @@ -4320,7 +4166,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { protect: 1, mirror: 1, distance: 1, metronome: 1, pulse: 1 }, - secondary: null, target: "any", type: "Dragon", contestType: "Beautiful", @@ -4336,7 +4181,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Dragon", contestType: "Cool", @@ -4349,7 +4193,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { name: "Dragon Rush", pp: 10, priority: 0, - flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, minimize: 1 }, secondary: { chance: 20, volatileStatus: 'flinch', @@ -4382,7 +4226,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, heal: 1, metronome: 1 }, drain: [3, 4], - secondary: null, target: "normal", type: "Fairy", contestType: "Cute", @@ -4397,7 +4240,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, punch: 1, heal: 1, metronome: 1 }, drain: [1, 2], - secondary: null, target: "normal", type: "Fighting", contestType: "Tough", @@ -4415,7 +4257,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onTryImmunity(target) { return target.status === 'slp' || target.hasAbility('comatose'); }, - secondary: null, target: "normal", type: "Psychic", contestType: "Clever", @@ -4429,7 +4270,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, distance: 1, metronome: 1 }, - secondary: null, target: "any", type: "Flying", contestType: "Cool", @@ -4444,7 +4284,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, critRatio: 2, - secondary: null, target: "normal", type: "Ground", contestType: "Tough", @@ -4478,7 +4317,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, multihit: 2, - secondary: null, target: "normal", type: "Dragon", maxMove: { basePower: 130 }, @@ -4494,7 +4332,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, multihit: 2, - secondary: null, target: "normal", type: "Flying", maxMove: { basePower: 130 }, @@ -4508,7 +4345,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { protect: 1, failencore: 1, nosleeptalk: 1, failcopycat: 1, failmimic: 1, failinstruct: 1, noparentalbond: 1 }, - secondary: null, target: "normal", type: "Dragon", }, @@ -4557,7 +4393,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { protect: 1, mirror: 1, nonsky: 1, metronome: 1 }, - secondary: null, target: "allAdjacent", type: "Ground", contestType: "Tough", @@ -4596,7 +4431,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "normal", type: "Normal", contestType: "Beautiful", @@ -4613,7 +4447,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { spa: -2, }, - secondary: null, target: "normal", type: "Electric", zMove: { boost: { spd: 1 } }, @@ -4654,7 +4487,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1, bullet: 1 }, - secondary: null, target: "normal", type: "Normal", contestType: "Cute", @@ -4713,7 +4545,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-fieldend', 'move: Electric Terrain'); }, }, - secondary: null, target: "all", type: "Electric", zMove: { boost: { spe: 1 } }, @@ -4746,7 +4577,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "normal", type: "Electric", zMove: { boost: { spa: 1 } }, @@ -4768,7 +4598,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1, bullet: 1 }, - secondary: null, target: "normal", type: "Electric", zMove: { basePower: 160 }, @@ -4791,7 +4620,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.chainModify([5461, 4096]); } }, - secondary: null, target: "normal", type: "Electric", contestType: "Cool", @@ -4822,8 +4650,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { attacker.addVolatile('twoturnmove', defender); return null; }, - secondary: null, - hasSheerForce: true, + hasSheerForceBoost: true, target: "normal", type: "Electric", }, @@ -4869,7 +4696,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-end', pokemon, 'Embargo'); }, }, - secondary: null, target: "normal", type: "Dark", zMove: { boost: { spa: 1 } }, @@ -4947,7 +4773,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { spe: 1 } }, @@ -4968,7 +4793,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onTryImmunity(target, pokemon) { return pokemon.hp < target.hp; }, - secondary: null, target: "normal", type: "Normal", zMove: { basePower: 160 }, @@ -5005,7 +4829,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "self", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -5054,7 +4877,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (!oldAbility) return oldAbility as false | null; if (!target.isAlly(source)) target.volatileStaleness = 'external'; }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { spd: 1 } }, @@ -5074,7 +4896,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "allAdjacentFoes", type: "Fire", contestType: "Beautiful", @@ -5113,7 +4934,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { self: { volatileStatus: 'mustrecharge', }, - secondary: null, target: "normal", type: "Dragon", }, @@ -5137,7 +4957,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { move.target = 'allAdjacentFoes'; } }, - secondary: null, target: "normal", type: "Psychic", }, @@ -5151,7 +4970,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1, noparentalbond: 1 }, selfdestruct: "always", - secondary: null, target: "allAdjacent", type: "Normal", contestType: "Beautiful", @@ -5191,7 +5009,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spd: 2, spe: 2, }, - secondary: null, target: "self", type: "Normal", contestType: "Beautiful", @@ -5205,7 +5022,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 2, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", contestType: "Cool", @@ -5224,7 +5040,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.chainModify(2); } }, - secondary: null, target: "normal", type: "Normal", contestType: "Cute", @@ -5248,7 +5063,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pokemon.tryTrap(); }, }, - secondary: null, target: "all", type: "Fairy", zMove: { boost: { def: 1 } }, @@ -5263,7 +5077,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 30, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1, wind: 1 }, - secondary: null, target: "normal", type: "Fairy", contestType: "Beautiful", @@ -5303,7 +5116,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { spd: -2, }, - secondary: null, target: "normal", type: "Dark", zMove: { boost: { spa: 1 } }, @@ -5318,7 +5130,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Dark", }, @@ -5335,7 +5146,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onDamage(damage, target, source, effect) { if (damage >= target.hp) return target.hp - 1; }, - secondary: null, target: "normal", type: "Normal", contestType: "Cool", @@ -5352,7 +5162,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { atk: -2, }, - secondary: null, target: "normal", type: "Flying", zMove: { boost: { def: 1 } }, @@ -5369,7 +5178,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: { mirror: 1, noassist: 1, failcopycat: 1 }, breaksProtect: true, // Breaking protection implemented in scripts.js - secondary: null, target: "normal", type: "Normal", contestType: "Clever", @@ -5384,7 +5192,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Dark", contestType: "Clever", @@ -5401,7 +5208,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onAfterMoveSecondarySelf(pokemon, target, move) { if (!target || target.fainted || target.hp <= 0) this.boost({ atk: 3 }, pokemon, pokemon, move); }, - secondary: null, target: "normal", type: "Bug", contestType: "Cool", @@ -5422,7 +5228,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.chainModify(2); } }, - secondary: null, target: "normal", type: "Dragon", }, @@ -5487,7 +5292,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spa: 2, spe: 2, }, - secondary: null, target: "self", type: "Normal", }, @@ -5506,7 +5310,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { protect: 1, metronome: 1, noparentalbond: 1 }, - secondary: null, target: "normal", type: "Fighting", zMove: { basePower: 180 }, @@ -5629,7 +5432,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-sideend', targetSide, 'Fire Pledge'); }, }, - secondary: null, target: "normal", type: "Fire", contestType: "Beautiful", @@ -5661,7 +5463,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, volatileStatus: 'partiallytrapped', - secondary: null, target: "normal", type: "Fire", contestType: "Beautiful", @@ -5681,7 +5482,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return false; } }, - secondary: null, target: "normal", type: "Bug", contestType: "Cute", @@ -5704,7 +5504,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, bite: 1 }, - secondary: null, target: "normal", type: "Water", }, @@ -5718,7 +5517,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, nonsky: 1, metronome: 1 }, ohko: true, - secondary: null, target: "normal", type: "Ground", zMove: { basePower: 180 }, @@ -5753,7 +5551,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", zMove: { basePower: 160 }, @@ -5780,7 +5577,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.damage(ally.baseMaxhp / 16, ally, source, this.dex.conditions.get('Flame Burst')); } }, - secondary: null, target: "normal", type: "Fire", contestType: "Beautiful", @@ -5871,7 +5667,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { accuracy: -1, }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { evasion: 1 } }, @@ -5909,7 +5704,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { spa: 1, }, - secondary: null, target: "normal", type: "Dark", zMove: { boost: { spd: 1 } }, @@ -5929,7 +5723,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spa: -2, }, }, - secondary: null, target: "normal", type: "Fairy", contestType: "Beautiful", @@ -5984,7 +5777,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pokemon.removeVolatile('fling'); }, }, - secondary: null, target: "normal", type: "Dark", contestType: "Cute", @@ -5999,7 +5791,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, selfSwitch: true, - secondary: null, target: "normal", type: "Water", }, @@ -6046,7 +5837,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } return success; }, - secondary: null, target: "normal", type: "Fairy", zMove: { effect: 'clearnegativeboost' }, @@ -6080,7 +5870,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } return success; }, - secondary: null, target: "all", type: "Fairy", zMove: { boost: { def: 1 } }, @@ -6096,7 +5885,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, willCrit: true, - secondary: null, target: "normal", type: "Grass", }, @@ -6137,7 +5925,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "any", type: "Flying", contestType: "Clever", @@ -6149,12 +5936,11 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { category: "Physical", name: "Flying Press", pp: 10, - flags: { contact: 1, protect: 1, mirror: 1, gravity: 1, distance: 1, nonsky: 1, metronome: 1 }, + flags: { contact: 1, protect: 1, mirror: 1, gravity: 1, distance: 1, nonsky: 1, metronome: 1, minimize: 1 }, onEffectiveness(typeMod, target, type, move) { return typeMod + this.dex.getEffectiveness('Flying', type); }, priority: 0, - secondary: null, target: "any", type: "Fighting", zMove: { basePower: 170 }, @@ -6204,7 +5990,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return critRatio + 2; }, }, - secondary: null, target: "self", type: "Normal", zMove: { boost: { accuracy: 1 } }, @@ -6244,7 +6029,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (status.id === 'flinch') return null; }, }, - secondary: null, target: "normal", type: "Fighting", contestType: "Tough", @@ -6280,7 +6064,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "self", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -6331,7 +6114,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "normal", type: "Normal", zMove: { effect: 'crit2' }, @@ -6351,7 +6133,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (!target.addType('Grass')) return false; this.add('-start', target, 'typeadd', 'Grass', '[from] move: Forest\'s Curse'); }, - secondary: null, target: "normal", type: "Grass", zMove: { boost: { atk: 1, def: 1, spa: 1, spd: 1, spe: 1 } }, @@ -6367,7 +6148,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, overrideOffensivePokemon: 'target', - secondary: null, target: "normal", type: "Dark", contestType: "Clever", @@ -6452,7 +6232,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pokemon.clearBoosts(); } }, - secondary: null, target: "normal", type: "Ice", contestType: "Clever", @@ -6469,7 +6248,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { self: { volatileStatus: 'mustrecharge', }, - secondary: null, target: "normal", type: "Grass", contestType: "Cool", @@ -6484,7 +6262,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, willCrit: true, - secondary: null, target: "normal", type: "Ice", contestType: "Beautiful", @@ -6502,7 +6279,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", zMove: { basePower: 160 }, @@ -6519,7 +6295,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, multihit: [2, 5], - secondary: null, target: "normal", type: "Normal", contestType: "Cool", @@ -6553,7 +6328,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.effectState.duration = 2; }, }, - secondary: null, target: "normal", type: "Bug", contestType: "Cool", @@ -6568,7 +6342,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, multihit: [2, 5], - secondary: null, target: "normal", type: "Normal", maxMove: { basePower: 100 }, @@ -6589,7 +6362,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.chainModify(2); } }, - secondary: null, target: "normal", type: "Electric", contestType: "Cool", @@ -6609,7 +6381,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.chainModify(2); } }, - secondary: null, target: "normal", type: "Fire", contestType: "Beautiful", @@ -6645,7 +6416,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-start', source, 'move: Future Sight'); return this.NOT_FAIL; }, - secondary: null, target: "normal", type: "Psychic", contestType: "Clever", @@ -6680,7 +6450,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (pokemon.getAbility().flags['cantsuppress']) pokemon.removeVolatile('gastroacid'); }, }, - secondary: null, target: "normal", type: "Poison", zMove: { boost: { spe: 1 } }, @@ -6697,7 +6466,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, multihit: 2, - secondary: null, target: "normal", type: "Steel", zMove: { basePower: 180 }, @@ -6726,7 +6494,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } return didSomething; }, - secondary: null, target: "allySide", type: "Steel", zMove: { boost: { spa: 1 } }, @@ -6781,7 +6548,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spd: 2, spe: 2, }, - secondary: null, target: "self", type: "Fairy", zMove: { boost: { atk: 1, def: 1, spa: 1, spd: 1, spe: 1 } }, @@ -6797,7 +6563,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, heal: 1, metronome: 1 }, drain: [1, 2], - secondary: null, target: "normal", type: "Grass", contestType: "Clever", @@ -6814,7 +6579,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { self: { volatileStatus: 'mustrecharge', }, - secondary: null, target: "normal", type: "Normal", contestType: "Tough", @@ -6828,7 +6592,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1, cantusetwice: 1 }, - secondary: null, target: "normal", type: "Steel", }, @@ -6843,7 +6606,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "electriumz", - secondary: null, target: "normal", type: "Electric", contestType: "Cool", @@ -6857,7 +6619,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "allAdjacentFoes", type: "Ice", }, @@ -6909,7 +6670,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pokemon.removeVolatile('glaiverush'); }, }, - secondary: null, target: "normal", type: "Dragon", }, @@ -6923,7 +6683,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, reflectable: 1, mirror: 1, metronome: 1 }, status: 'par', - secondary: null, target: "normal", type: "Normal", zMove: { boost: { spd: 1 } }, @@ -6942,7 +6701,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { self: { sideCondition: 'lightscreen', }, - secondary: null, target: "normal", type: "Psychic", contestType: "Clever", @@ -6961,14 +6719,8 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { self: { onHit(source) { for (const pokemon of source.foes()) { - const result = this.random(3); - if (result === 0) { - pokemon.trySetStatus('slp', source); - } else if (result === 1) { - pokemon.trySetStatus('par', source); - } else { - pokemon.trySetStatus('psn', source); - } + const status = this.sample(['slp', 'par', 'psn']); + pokemon.trySetStatus(status, source); } }, }, @@ -7010,7 +6762,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-sideend', targetSide, 'G-Max Cannonade'); }, }, - secondary: null, target: "adjacentFoe", type: "Water", contestType: "Cool", @@ -7033,7 +6784,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "adjacentFoe", type: "Fire", contestType: "Cool", @@ -7075,7 +6825,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return critRatio + this.effectState.layers; }, }, - secondary: null, target: "adjacentFoe", type: "Fighting", contestType: "Cool", @@ -7098,7 +6847,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "adjacentFoe", type: "Normal", contestType: "Cool", @@ -7130,7 +6878,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "adjacentFoe", type: "Dragon", contestType: "Cool", @@ -7147,7 +6894,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: {}, isMax: "Rillaboom", ignoreAbility: true, - secondary: null, target: "adjacentFoe", type: "Grass", contestType: "Cool", @@ -7170,7 +6916,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "adjacentFoe", type: "Fairy", contestType: "Cool", @@ -7187,7 +6932,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: {}, isMax: "Cinderace", ignoreAbility: true, - secondary: null, target: "adjacentFoe", type: "Fire", contestType: "Cool", @@ -7210,7 +6954,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "adjacentFoe", type: "Water", contestType: "Cool", @@ -7233,7 +6976,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "adjacentFoe", type: "Normal", contestType: "Cool", @@ -7268,7 +7010,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: {}, isMax: "Inteleon", ignoreAbility: true, - secondary: null, target: "adjacentFoe", type: "Water", contestType: "Cool", @@ -7313,7 +7054,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "adjacentFoe", type: "Steel", contestType: "Cool", @@ -7329,7 +7069,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isMax: "Urshifu", - secondary: null, target: "adjacentFoe", type: "Dark", contestType: "Cool", @@ -7345,7 +7084,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isMax: "Urshifu-Rapid-Strike", - secondary: null, target: "adjacentFoe", type: "Water", contestType: "Cool", @@ -7376,7 +7114,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "adjacentFoe", type: "Normal", contestType: "Cool", @@ -7395,7 +7132,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { self: { sideCondition: 'auroraveil', }, - secondary: null, target: "adjacentFoe", type: "Ice", contestType: "Cool", @@ -7418,7 +7154,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "adjacentFoe", type: "Ground", contestType: "Cool", @@ -7441,7 +7176,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "adjacentFoe", type: "Fairy", contestType: "Cool", @@ -7467,7 +7201,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (this.randomChance(1, 2)) return; target.addVolatile('yawn'); }, - secondary: null, target: "adjacentFoe", type: "Dark", contestType: "Cool", @@ -7506,7 +7239,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.damage(pokemon.maxhp * (2 ** typeMod) / 8); }, }, - secondary: null, target: "adjacentFoe", type: "Steel", contestType: "Cool", @@ -7529,7 +7261,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "adjacentFoe", type: "Water", contestType: "Cool", @@ -7557,7 +7288,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "adjacentFoe", type: "Electric", contestType: "Cool", @@ -7580,7 +7310,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "adjacentFoe", type: "Grass", contestType: "Cool", @@ -7603,7 +7332,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "adjacentFoe", type: "Grass", contestType: "Cool", @@ -7626,7 +7354,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "adjacentFoe", type: "Ghost", contestType: "Cool", @@ -7665,7 +7392,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-sideend', targetSide, 'G-Max Vine Lash'); }, }, - secondary: null, target: "adjacentFoe", type: "Grass", contestType: "Cool", @@ -7704,7 +7430,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-sideend', targetSide, 'G-Max Volcalith'); }, }, - secondary: null, target: "adjacentFoe", type: "Rock", contestType: "Cool", @@ -7727,7 +7452,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "adjacentFoe", type: "Electric", contestType: "Cool", @@ -7766,7 +7490,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-sideend', targetSide, 'G-Max Wildfire'); }, }, - secondary: null, target: "adjacentFoe", type: "Fire", contestType: "Cool", @@ -7804,7 +7527,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return success; }, }, - secondary: null, target: "adjacentFoe", type: "Flying", contestType: "Cool", @@ -7844,7 +7566,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return null; } }, - secondary: null, target: "normal", type: "Grass", zMove: { basePower: 160 }, @@ -7908,7 +7629,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.chainModify(0.25); }, }, - secondary: null, target: "normal", type: "Grass", contestType: "Beautiful", @@ -7924,7 +7644,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, reflectable: 1, mirror: 1, sound: 1, bypasssub: 1, metronome: 1 }, status: 'slp', - secondary: null, target: "normal", type: "Grass", zMove: { boost: { spe: 1 } }, @@ -7944,7 +7663,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return priority + 1; } }, - secondary: null, target: "normal", type: "Grass", contestType: "Cool", @@ -8002,7 +7720,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-fieldend', 'move: Grassy Terrain'); }, }, - secondary: null, target: "all", type: "Grass", zMove: { boost: { def: 1 } }, @@ -8115,7 +7832,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-fieldend', 'move: Gravity'); }, }, - secondary: null, target: "all", type: "Psychic", zMove: { boost: { spa: 1 } }, @@ -8133,7 +7849,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { atk: -1, }, - secondary: null, target: "allAdjacentFoes", type: "Normal", zMove: { boost: { def: 1 } }, @@ -8155,7 +7870,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { atk: 1, spa: 1, }, - secondary: null, target: "self", type: "Normal", zMove: { boost: { spa: 1 } }, @@ -8196,7 +7910,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pokemon.removeVolatile('grudge'); }, }, - secondary: null, target: "self", type: "Ghost", zMove: { effect: 'redirect' }, @@ -8224,7 +7937,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "tapuniumz", - secondary: null, target: "normal", type: "Fairy", contestType: "Tough", @@ -8247,7 +7959,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { source.storedStats.spd = newspd; this.add('-activate', source, 'move: Guard Split', `[of] ${target}`); }, - secondary: null, target: "normal", type: "Psychic", zMove: { boost: { spe: 1 } }, @@ -8277,7 +7988,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-swapboost', source, target, 'def, spd', '[from] move: Guard Swap'); }, - secondary: null, target: "normal", type: "Psychic", zMove: { boost: { spe: 1 } }, @@ -8293,7 +8003,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, ohko: true, - secondary: null, target: "normal", type: "Normal", zMove: { basePower: 180 }, @@ -8326,7 +8035,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 35, priority: 0, flags: { protect: 1, mirror: 1, distance: 1, metronome: 1, wind: 1 }, - secondary: null, target: "any", type: "Flying", contestType: "Clever", @@ -8347,7 +8055,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, bullet: 1 }, - secondary: null, target: "normal", type: "Steel", zMove: { basePower: 160 }, @@ -8365,7 +8072,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { metronome: 1 }, weather: 'hail', - secondary: null, target: "all", type: "Ice", zMove: { boost: { spe: 1 } }, @@ -8385,7 +8091,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spe: -1, }, }, - secondary: null, target: "normal", type: "Fighting", contestType: "Tough", @@ -8402,7 +8107,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onTryHit(target, source) { this.add('-activate', target, 'move: Happy Hour'); }, - secondary: null, target: "allySide", type: "Normal", zMove: { boost: { atk: 1, def: 1, spa: 1, spd: 1, spe: 1 } }, @@ -8420,7 +8124,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { def: 1, }, - secondary: null, target: "self", type: "Normal", zMove: { boost: { def: 1 } }, @@ -8442,7 +8145,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Steel", }, @@ -8461,7 +8163,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pokemon.clearBoosts(); } }, - secondary: null, target: "all", type: "Ice", zMove: { effect: 'heal' }, @@ -8495,7 +8196,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, recoil: [1, 4], - secondary: null, target: "normal", type: "Normal", contestType: "Tough", @@ -8515,7 +8215,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spd: -1, }, }, - secondary: null, target: "normal", type: "Ground", }, @@ -8529,7 +8228,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, recoil: [1, 2], - secondary: null, target: "normal", type: "Rock", contestType: "Tough", @@ -8608,7 +8306,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return false; } }, - onModifyMove(move, pokemon, target) { + onModifyMove(move, pokemon) { if (move.flags['heal'] && !move.isZ && !move.isMax) { this.add('cant', pokemon, 'move: Heal Block', move); return false; @@ -8637,7 +8335,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "allAdjacentFoes", type: "Psychic", zMove: { boost: { spa: 2 } }, @@ -8674,7 +8371,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "self", type: "Psychic", contestType: "Beautiful", @@ -8690,7 +8386,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { snatch: 1, heal: 1, metronome: 1 }, heal: [1, 2], - secondary: null, target: "self", type: "Bug", zMove: { effect: 'clearnegativeboost' }, @@ -8721,7 +8416,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } return success; }, - secondary: null, target: "any", type: "Psychic", zMove: { effect: 'clearnegativeboost' }, @@ -8769,7 +8463,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-swapboost', source, target, '[from] move: Heart Swap'); }, - secondary: null, target: "normal", type: "Psychic", zMove: { effect: 'crit2' }, @@ -8801,7 +8494,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { name: "Heat Crash", pp: 10, priority: 0, - flags: { contact: 1, protect: 1, mirror: 1, nonsky: 1, metronome: 1 }, + flags: { contact: 1, protect: 1, mirror: 1, nonsky: 1, metronome: 1, minimize: 1 }, onTryHit(target, pokemon, move) { if (target.volatiles['dynamax']) { this.add('-fail', pokemon, 'Dynamax'); @@ -8809,7 +8502,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return null; } }, - secondary: null, target: "normal", type: "Fire", zMove: { basePower: 160 }, @@ -8859,7 +8551,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { name: "Heavy Slam", pp: 10, priority: 0, - flags: { contact: 1, protect: 1, mirror: 1, nonsky: 1, metronome: 1 }, + flags: { contact: 1, protect: 1, mirror: 1, nonsky: 1, metronome: 1, minimize: 1 }, onTryHit(target, pokemon, move) { if (target.volatiles['dynamax']) { this.add('-fail', pokemon, 'Dynamax'); @@ -8867,7 +8559,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return null; } }, - secondary: null, target: "normal", type: "Steel", zMove: { basePower: 160 }, @@ -8903,7 +8594,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.chainModify(this.effectState.multiplier); }, }, - secondary: null, target: "adjacentAlly", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -8925,7 +8615,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Ghost", zMove: { basePower: 160 }, @@ -8944,7 +8633,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onModifyType(move, pokemon) { move.type = pokemon.hpType || 'Dark'; }, - secondary: null, target: "normal", type: "Normal", contestType: "Clever", @@ -8960,7 +8648,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Bug", contestType: "Clever", @@ -8976,7 +8663,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Dark", contestType: "Clever", @@ -8992,7 +8678,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Dragon", contestType: "Clever", @@ -9008,7 +8693,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Electric", contestType: "Clever", @@ -9024,7 +8708,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Fighting", contestType: "Clever", @@ -9040,7 +8723,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Fire", contestType: "Clever", @@ -9056,7 +8738,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Flying", contestType: "Clever", @@ -9072,7 +8753,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Ghost", contestType: "Clever", @@ -9088,7 +8768,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Grass", contestType: "Clever", @@ -9104,7 +8783,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Ground", contestType: "Clever", @@ -9120,7 +8798,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Ice", contestType: "Clever", @@ -9136,7 +8813,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Poison", contestType: "Clever", @@ -9152,7 +8828,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Psychic", contestType: "Clever", @@ -9168,7 +8843,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Rock", contestType: "Clever", @@ -9184,7 +8858,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Steel", contestType: "Clever", @@ -9200,7 +8873,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Water", contestType: "Clever", @@ -9214,7 +8886,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Ground", contestType: "Tough", @@ -9232,7 +8903,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onMoveFail(target, source, move) { this.damage(source.baseMaxhp / 2, source, source, this.dex.conditions.get('High Jump Kick')); }, - secondary: null, target: "normal", type: "Fighting", contestType: "Cool", @@ -9251,7 +8921,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onDamage(damage, target, source, effect) { if (damage >= target.hp) return target.hp - 1; }, - secondary: null, target: "normal", type: "Normal", contestType: "Cool", @@ -9266,7 +8935,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 40, priority: 0, flags: { bypasssub: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failmimic: 1, failinstruct: 1 }, - secondary: null, target: "adjacentAlly", type: "Normal", zMove: { boost: { atk: 1, def: 1, spa: 1, spd: 1, spe: 1 } }, @@ -9285,7 +8953,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { atk: 1, accuracy: 1, }, - secondary: null, target: "self", type: "Dark", zMove: { boost: { atk: 1 } }, @@ -9300,7 +8967,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 25, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", contestType: "Cool", @@ -9315,7 +8981,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, ohko: true, - secondary: null, target: "normal", type: "Normal", zMove: { basePower: 180 }, @@ -9332,7 +8997,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, heal: 1, metronome: 1 }, drain: [1, 2], - secondary: null, target: "normal", type: "Grass", contestType: "Tough", @@ -9349,7 +9013,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { atk: 1, }, - secondary: null, target: "allies", type: "Normal", zMove: { boost: { atk: 1 } }, @@ -9396,7 +9059,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { self: { volatileStatus: 'mustrecharge', }, - secondary: null, target: "normal", type: "Water", contestType: "Beautiful", @@ -9410,7 +9072,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Water", contestType: "Beautiful", @@ -9426,7 +9087,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: { protect: 1, mirror: 1, defrost: 1, metronome: 1 }, // Damage boost in Sun applied in conditions.ts thawsTarget: true, - secondary: null, target: "normal", type: "Water", }, @@ -9441,7 +9101,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "wateriumz", - secondary: null, target: "normal", type: "Water", contestType: "Cool", @@ -9458,7 +9117,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { self: { volatileStatus: 'mustrecharge', }, - secondary: null, target: "normal", type: "Normal", contestType: "Cool", @@ -9472,7 +9130,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { contact: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Normal", contestType: "Clever", @@ -9524,7 +9181,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { def: -1, }, }, - secondary: null, target: "normal", type: "Dark", contestType: "Tough", @@ -9539,7 +9195,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { mirror: 1, bypasssub: 1 }, breaksProtect: true, - secondary: null, target: "normal", type: "Psychic", contestType: "Clever", @@ -9553,7 +9208,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { protect: 1, mirror: 1, sound: 1, bypasssub: 1, metronome: 1 }, - secondary: null, target: "allAdjacentFoes", type: "Normal", contestType: "Cool", @@ -9568,7 +9222,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, reflectable: 1, mirror: 1, metronome: 1 }, status: 'slp', - secondary: null, target: "normal", type: "Psychic", zMove: { boost: { spe: 1 } }, @@ -9637,7 +9290,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "normal", type: "Ice", contestType: "Beautiful", @@ -9723,7 +9375,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spe: -1, }, }, - secondary: null, target: "normal", type: "Ice", contestType: "Tough", @@ -9754,7 +9405,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 30, priority: 1, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Ice", contestType: "Beautiful", @@ -9769,16 +9419,13 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, onAfterHit(target, source) { - if (source.hp) { - this.field.clearTerrain(); - } + this.field.clearTerrain(); }, onAfterSubDamage(damage, target, source) { if (source.hp) { this.field.clearTerrain(); } }, - secondary: null, target: "normal", type: "Ice", }, @@ -9809,7 +9456,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, multihit: [2, 5], - secondary: null, target: "normal", type: "Ice", zMove: { basePower: 140 }, @@ -9865,7 +9511,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "self", type: "Psychic", zMove: { boost: { spd: 2 } }, @@ -9886,7 +9531,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-enditem', pokemon, item.name, '[from] move: Incinerate'); } }, - secondary: null, target: "allAdjacentFoes", type: "Fire", contestType: "Tough", @@ -9939,7 +9583,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "firiumz", - secondary: null, target: "normal", type: "Fire", contestType: "Cool", @@ -9954,7 +9597,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, volatileStatus: 'partiallytrapped', - secondary: null, target: "normal", type: "Bug", contestType: "Cute", @@ -9986,7 +9628,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return null; }, }, - secondary: null, target: "self", type: "Grass", zMove: { boost: { spd: 1 } }, @@ -10021,7 +9662,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { targetLoc: target.lastMoveTargetLoc!, })[0] as MoveAction); }, - secondary: null, target: "normal", type: "Psychic", zMove: { boost: { spa: 1 } }, @@ -10052,7 +9692,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "all", type: "Electric", zMove: { boost: { spa: 1 } }, @@ -10070,7 +9709,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { def: 2, }, - secondary: null, target: "self", type: "Steel", zMove: { effect: 'clearnegativeboost' }, @@ -10140,7 +9778,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { break; } }, - secondary: null, target: "normal", type: "Grass", }, @@ -10157,7 +9794,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { source.addVolatile('trapped', target, move, 'trapper'); target.addVolatile('trapped', source, move, 'trapper'); }, - secondary: null, target: "normal", type: "Dark", }, @@ -10170,7 +9806,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 1, flags: { contact: 1, protect: 1, mirror: 1, punch: 1 }, - secondary: null, target: "normal", type: "Water", contestType: "Cool", @@ -10191,7 +9826,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { move.type = item.onPlate; } }, - secondary: null, target: "normal", type: "Normal", contestType: "Beautiful", @@ -10210,7 +9844,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onMoveFail(target, source, move) { this.damage(source.baseMaxhp / 2, source, source, this.dex.conditions.get('Jump Kick')); }, - secondary: null, target: "normal", type: "Fighting", contestType: "Cool", @@ -10228,7 +9861,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { const success = !!this.heal(this.modify(pokemon.maxhp, 0.25)); return pokemon.cureStatus() || success; }, - secondary: null, target: "allies", type: "Grass", }, @@ -10243,7 +9875,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, critRatio: 2, - secondary: null, target: "normal", type: "Fighting", contestType: "Tough", @@ -10261,7 +9892,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { accuracy: -1, }, - secondary: null, target: "normal", type: "Psychic", zMove: { boost: { evasion: 1 } }, @@ -10292,11 +9922,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { }, onTryHitPriority: 3, onTryHit(target, source, move) { - if (!move.flags['protect'] || move.category === 'Status') { - if (['gmaxoneblow', 'gmaxrapidflow'].includes(move.id)) return; - if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true; - return; - } + if (this.checkMoveBypassesProtect(move, source, target, false)) return; if (move.smartTarget) { move.smartTarget = false; } else { @@ -10320,7 +9946,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "self", type: "Steel", zMove: { effect: 'clearnegativeboost' }, @@ -10343,14 +9968,11 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, onAfterHit(target, source) { - if (source.hp) { - const item = target.takeItem(); - if (item) { - this.add('-enditem', target, item.name, '[from] move: Knock Off', `[of] ${source}`); - } + const item = target.takeItem(); + if (item) { + this.add('-enditem', target, item.name, '[from] move: Knock Off', `[of] ${source}`); } }, - secondary: null, target: "normal", type: "Dark", contestType: "Clever", @@ -10364,7 +9986,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, slicing: 1 }, - secondary: null, target: "normal", type: "Dark", }, @@ -10378,7 +9999,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { protect: 1, mirror: 1, nonsky: 1, metronome: 1 }, - secondary: null, target: "allAdjacentFoes", type: "Ground", zMove: { basePower: 185 }, @@ -10415,7 +10035,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-end', pokemon, 'move: Laser Focus', '[silent]'); }, }, - secondary: null, target: "self", type: "Normal", zMove: { boost: { atk: 1 } }, @@ -10436,7 +10055,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.chainModify(2); } }, - secondary: null, target: "normal", type: "Dark", }, @@ -10461,7 +10079,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } return hasLastResort; }, - secondary: null, target: "normal", type: "Normal", contestType: "Cute", @@ -10478,7 +10095,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Ghost", }, @@ -10508,7 +10124,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 40, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Grass", contestType: "Tough", @@ -10523,7 +10138,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, slicing: 1 }, critRatio: 2, - secondary: null, target: "normal", type: "Grass", contestType: "Cool", @@ -10542,7 +10156,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spa: -2, }, }, - secondary: null, target: "normal", type: "Grass", contestType: "Beautiful", @@ -10577,7 +10190,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, heal: 1, metronome: 1 }, drain: [1, 2], - secondary: null, target: "normal", type: "Bug", contestType: "Clever", @@ -10612,7 +10224,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onTryImmunity(target) { return !target.hasType('Grass'); }, - secondary: null, target: "normal", type: "Grass", zMove: { effect: 'clearnegativeboost' }, @@ -10630,7 +10241,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { def: -1, }, - secondary: null, target: "allAdjacentFoes", type: "Normal", zMove: { boost: { atk: 1 } }, @@ -10647,7 +10257,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1 }, isZ: "mimikiumz", - secondary: null, target: "normal", type: "Fairy", contestType: "Cool", @@ -10679,7 +10288,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { snatch: 1, heal: 1, bypasssub: 1 }, heal: [1, 4], - secondary: null, target: "allies", type: "Water", }, @@ -10694,7 +10302,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1 }, recoil: [1, 2], - secondary: null, target: "normal", type: "Fairy", contestType: "Beautiful", @@ -10735,7 +10342,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-sideend', side, 'move: Light Screen'); }, }, - secondary: null, target: "allySide", type: "Psychic", zMove: { boost: { spd: 1 } }, @@ -10756,7 +10362,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { }, ignoreAbility: true, isZ: "ultranecroziumz", - secondary: null, target: "normal", type: "Psychic", contestType: "Cool", @@ -10807,7 +10412,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (move && source === this.effectState.target && target === this.effectState.source) return true; }, }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { spe: 1 } }, @@ -10824,7 +10428,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, reflectable: 1, mirror: 1, metronome: 1 }, status: 'slp', - secondary: null, target: "normal", type: "Normal", zMove: { boost: { spe: 1 } }, @@ -10865,7 +10468,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return null; } }, - secondary: null, target: "normal", type: "Fighting", zMove: { basePower: 160 }, @@ -10913,7 +10515,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-sideend', side, 'move: Lucky Chant'); // "[side.name]'s team's Lucky Chant wore off!" }, }, - secondary: null, target: "allySide", type: "Normal", zMove: { boost: { evasion: 1 } }, @@ -10950,7 +10551,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { const success = !!this.heal(this.modify(pokemon.maxhp, 0.25)); return pokemon.cureStatus() || success; }, - secondary: null, target: "allies", type: "Psychic", }, @@ -10994,7 +10594,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "self", type: "Psychic", contestType: "Beautiful", @@ -11046,7 +10645,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 30, priority: 1, flags: { contact: 1, protect: 1, mirror: 1, punch: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Fighting", contestType: "Cool", @@ -11060,7 +10658,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Grass", contestType: "Beautiful", @@ -11127,7 +10724,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return null; }, }, - secondary: null, target: "self", type: "Psychic", zMove: { boost: { spd: 2 } }, @@ -11146,7 +10742,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (target.getTypes().join() === 'Psychic' || !target.setType('Psychic')) return false; this.add('-start', target, 'typechange', 'Psychic'); }, - secondary: null, target: "normal", type: "Psychic", }, @@ -11189,7 +10784,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-fieldend', 'move: Magic Room', '[of] ' + this.effectState.source); }, }, - secondary: null, target: "all", type: "Psychic", zMove: { boost: { spd: 1 } }, @@ -11205,7 +10799,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, volatileStatus: 'partiallytrapped', - secondary: null, target: "normal", type: "Fire", contestType: "Tough", @@ -11220,7 +10813,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1, bullet: 1 }, - secondary: null, target: "normal", type: "Steel", contestType: "Cool", @@ -11247,7 +10839,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } return didSomething; }, - secondary: null, target: "allySide", type: "Electric", zMove: { boost: { spd: 1 } }, @@ -11285,7 +10876,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-end', target, 'Magnet Rise'); }, }, - secondary: null, target: "self", type: "Electric", zMove: { boost: { evasion: 1 } }, @@ -11329,7 +10919,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onUseMoveMessage(pokemon, target, move) { this.add('-activate', pokemon, 'move: Magnitude', move.magnitude); }, - secondary: null, target: "allAdjacent", type: "Ground", zMove: { basePower: 140 }, @@ -11350,7 +10939,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spa: -1, }, }, - secondary: null, target: "allAdjacentFoes", type: "Steel", contestType: "Beautiful", @@ -11364,9 +10952,8 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { name: "Malicious Moonsault", pp: 1, priority: 0, - flags: { contact: 1 }, + flags: { contact: 1, minimize: 1 }, isZ: "inciniumz", - secondary: null, target: "normal", type: "Dark", contestType: "Cool", @@ -11413,12 +11000,8 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { }, onTryHitPriority: 3, onTryHit(target, source, move) { - if (!move.flags['protect']) { - if (['gmaxoneblow', 'gmaxrapidflow'].includes(move.id)) return; - if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true; - return; - } - if (move && (move.target === 'self' || move.category === 'Status')) return; + if (move.target === 'self') return; + if (this.checkMoveBypassesProtect(move, source, target, false)) return; this.add('-activate', target, 'move: Mat Block', move.name); const lockedmove = source.getVolatile('lockedmove'); if (lockedmove) { @@ -11430,7 +11013,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.NOT_FAIL; }, }, - secondary: null, target: "allySide", type: "Fighting", zMove: { boost: { def: 1 } }, @@ -11610,7 +11192,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.NOT_FAIL; }, }, - secondary: null, target: "self", type: "Normal", contestType: "Cool", @@ -11914,7 +11495,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onHit(target, source, move) { return target.addVolatile('trapped', source, move, 'trapper'); }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { spd: 1 } }, @@ -11933,7 +11513,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { atk: 1, }, - secondary: null, target: "self", type: "Psychic", zMove: { boost: { atk: 1 } }, @@ -11973,7 +11552,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { }, }, callsMove: true, - secondary: null, target: "adjacentFoe", type: "Normal", zMove: { boost: { spe: 2 } }, @@ -11989,7 +11567,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, heal: 1, metronome: 1 }, drain: [1, 2], - secondary: null, target: "normal", type: "Grass", zMove: { basePower: 120 }, @@ -12004,7 +11581,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Bug", contestType: "Cool", @@ -12018,7 +11594,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", contestType: "Cool", @@ -12032,7 +11607,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, punch: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", contestType: "Tough", @@ -12051,7 +11625,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spa: -2, }, selfdestruct: "ifHit", - secondary: null, target: "normal", type: "Dark", zMove: { effect: 'healreplacement' }, @@ -12069,7 +11642,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: {}, isZ: "lunaliumz", ignoreAbility: true, - secondary: null, target: "normal", type: "Ghost", contestType: "Cool", @@ -12100,7 +11672,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { targetRelayVar.target = this.getAtSlot(lastDamagedBy.slot); } }, - secondary: null, target: "scripted", type: "Steel", contestType: "Cool", @@ -12138,7 +11709,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { spd: -2, }, - secondary: null, target: "normal", type: "Steel", zMove: { boost: { spa: 1 } }, @@ -12157,7 +11727,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { self: { volatileStatus: 'mustrecharge', }, - secondary: null, target: "normal", type: "Fighting", }, @@ -12182,7 +11751,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { attacker.addVolatile('twoturnmove', defender); return null; }, - secondary: null, target: "normal", type: "Rock", }, @@ -12230,7 +11798,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.actions.useMove(randomMove, pokemon); }, callsMove: true, - secondary: null, target: "self", type: "Normal", contestType: "Cute", @@ -12244,7 +11811,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { contact: 1, mirror: 1, metronome: 1, slicing: 1 }, - secondary: null, target: "normal", type: "Rock", }, @@ -12258,7 +11824,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { snatch: 1, heal: 1, metronome: 1 }, heal: [1, 2], - secondary: null, target: "self", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -12297,7 +11862,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { }; this.add('-start', source, 'Mimic', move.name); }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { accuracy: 1 } }, @@ -12323,7 +11887,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } } }, - secondary: null, target: "allAdjacent", type: "Fire", contestType: "Cool", @@ -12345,7 +11908,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { source.addVolatile('lockon', target); this.add('-activate', source, 'move: Mind Reader', `[of] ${target}`); }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { spa: 1 } }, @@ -12365,18 +11927,12 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { noCopy: true, onRestart: () => null, onSourceModifyDamage(damage, source, target, move) { - const boostedMoves = [ - 'stomp', 'steamroller', 'bodyslam', 'flyingpress', 'dragonrush', 'heatcrash', 'heavyslam', 'maliciousmoonsault', 'supercellslam', - ]; - if (boostedMoves.includes(move.id)) { + if (move.flags['minimize']) { return this.chainModify(2); } }, onAccuracy(accuracy, target, source, move) { - const boostedMoves = [ - 'stomp', 'steamroller', 'bodyslam', 'flyingpress', 'dragonrush', 'heatcrash', 'heavyslam', 'maliciousmoonsault', 'supercellslam', - ]; - if (boostedMoves.includes(move.id)) { + if (move.flags['minimize']) { return true; } return accuracy; @@ -12385,7 +11941,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { evasion: 2, }, - secondary: null, target: "self", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -12419,7 +11974,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "normal", type: "Psychic", zMove: { boost: { spa: 1 } }, @@ -12465,7 +12019,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "scripted", type: "Psychic", contestType: "Beautiful", @@ -12489,7 +12042,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return null; }, callsMove: true, - secondary: null, target: "normal", type: "Flying", zMove: { boost: { atk: 2 } }, @@ -12552,7 +12104,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-sideend', side, 'Mist'); }, }, - secondary: null, target: "allySide", type: "Ice", zMove: { effect: 'heal' }, @@ -12593,7 +12144,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.chainModify(1.5); } }, - secondary: null, target: "allAdjacent", type: "Fairy", }, @@ -12650,7 +12200,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-fieldend', 'Misty Terrain'); }, }, - secondary: null, target: "all", type: "Fairy", zMove: { boost: { spd: 1 } }, @@ -12685,7 +12234,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1 }, ignoreAbility: true, - secondary: null, target: "normal", type: "Ghost", contestType: "Cool", @@ -12721,7 +12269,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } return success; }, - secondary: null, target: "self", type: "Fairy", zMove: { effect: 'clearnegativeboost' }, @@ -12758,7 +12305,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } return success; }, - secondary: null, target: "self", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -12775,16 +12321,16 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, onAfterHit(target, pokemon, move) { if (!move.hasSheerForce) { - if (pokemon.hp && pokemon.removeVolatile('leechseed')) { + if (pokemon.removeVolatile('leechseed')) { this.add('-end', pokemon, 'Leech Seed', '[from] move: Mortal Spin', `[of] ${pokemon}`); } const sideConditions = ['spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge']; for (const condition of sideConditions) { - if (pokemon.hp && pokemon.side.removeSideCondition(condition)) { + if (pokemon.side.removeSideCondition(condition)) { this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Mortal Spin', `[of] ${pokemon}`); } } - if (pokemon.hp && pokemon.volatiles['partiallytrapped']) { + if (pokemon.volatiles['partiallytrapped']) { pokemon.removeVolatile('partiallytrapped'); } } @@ -12934,7 +12480,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-fieldend', 'move: Mud Sport'); }, }, - secondary: null, target: "all", type: "Ground", zMove: { boost: { spd: 1 } }, @@ -12954,7 +12499,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (pokemon.ignoringItem()) return; move.type = this.runEvent('Memory', pokemon, null, move, 'Normal'); }, - secondary: null, target: "normal", type: "Normal", zMove: { basePower: 185 }, @@ -13012,7 +12556,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { spa: 2, }, - secondary: null, target: "self", type: "Dark", zMove: { effect: 'clearnegativeboost' }, @@ -13045,7 +12588,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pokemon.usedItemThisTurn = true; this.runEvent('AfterUseItem', pokemon, null, null, item); }, - secondary: null, target: "normal", type: "Normal", zMove: { basePower: 160 }, @@ -13077,7 +12619,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return null; }, callsMove: true, - secondary: null, target: "normal", type: "Normal", contestType: "Beautiful", @@ -13095,7 +12636,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Fairy", contestType: "Tough", @@ -13129,7 +12669,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "ghostiumz", - secondary: null, target: "normal", type: "Ghost", contestType: "Cool", @@ -13177,7 +12716,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.damage(pokemon.baseMaxhp / 4); }, }, - secondary: null, target: "normal", type: "Ghost", zMove: { boost: { spa: 1 } }, @@ -13193,7 +12731,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Ghost", contestType: "Clever", @@ -13208,7 +12745,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, slicing: 1 }, critRatio: 2, - secondary: null, target: "normal", type: "Dark", contestType: "Cool", @@ -13226,7 +12762,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { ignoreEvasion: true, ignoreDefensive: true, ignoreImmunity: { 'Fairy': true }, - secondary: null, target: "allAdjacentFoes", type: "Dragon", }, @@ -13243,7 +12778,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { atk: -1, spa: -1, }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { def: 1 } }, @@ -13280,7 +12814,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spd: 1, spe: 1, }, - secondary: null, target: "self", type: "Fighting", }, @@ -13332,7 +12865,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, distance: 1, heal: 1, metronome: 1 }, drain: [3, 4], - secondary: null, target: "any", type: "Flying", contestType: "Cool", @@ -13362,11 +12894,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { }, onTryHitPriority: 3, onTryHit(target, source, move) { - if (!move.flags['protect'] || move.category === 'Status') { - if (['gmaxoneblow', 'gmaxrapidflow'].includes(move.id)) return; - if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true; - return; - } + if (this.checkMoveBypassesProtect(move, source, target, false)) return; if (move.smartTarget) { move.smartTarget = false; } else { @@ -13390,7 +12918,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "self", type: "Dark", }, @@ -13405,7 +12932,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "primariumz", - secondary: null, target: "normal", type: "Water", contestType: "Cool", @@ -13462,7 +12988,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (this.effectState.source?.isActive) pokemon.tryTrap(); }, }, - secondary: null, target: "normal", type: "Fighting", }, @@ -13480,7 +13005,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onTryHit(target) { if (target.volatiles['miracleeye']) return false; }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { atk: 1 } }, @@ -13537,8 +13061,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { break; } }, - secondary: null, - hasSheerForce: true, + hasSheerForceBoost: true, target: "normal", type: "Dragon", }, @@ -13567,7 +13090,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { self: { volatileStatus: 'lockedmove', }, - secondary: null, target: "randomNormal", type: "Dragon", contestType: "Cool", @@ -13581,7 +13103,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { protect: 1, mirror: 1, sound: 1, bypasssub: 1 }, - secondary: null, target: "allAdjacentFoes", type: "Electric", }, @@ -13599,7 +13120,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spa: -2, }, }, - secondary: null, target: "normal", type: "Fire", contestType: "Beautiful", @@ -13622,7 +13142,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pokemon.sethp(averagehp); this.add('-sethp', pokemon, pokemon.getHealth, '[from] move: Pain Split'); }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { def: 1 } }, @@ -13638,7 +13157,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, heal: 1, metronome: 1 }, drain: [1, 2], - secondary: null, target: "allAdjacent", type: "Electric", contestType: "Clever", @@ -13659,7 +13177,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, selfSwitch: true, - secondary: null, target: "normal", type: "Dark", zMove: { effect: 'healreplacement' }, @@ -13682,7 +13199,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Dark", contestType: "Tough", @@ -13696,7 +13212,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", contestType: "Clever", @@ -13710,7 +13225,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 35, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, distance: 1, metronome: 1 }, - secondary: null, target: "any", type: "Flying", contestType: "Cool", @@ -13755,7 +13269,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-start', pokemon, `perish${duration}`); }, }, - secondary: null, target: "all", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -13770,7 +13283,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1, wind: 1 }, - secondary: null, target: "allAdjacent", type: "Grass", contestType: "Beautiful", @@ -13787,7 +13299,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { self: { volatileStatus: 'lockedmove', }, - secondary: null, target: "randomNormal", type: "Grass", contestType: "Beautiful", @@ -13817,7 +13328,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { duration: 2, onInvulnerability: false, }, - secondary: null, target: "normal", type: "Ghost", contestType: "Cool", @@ -13835,7 +13345,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (pokemon.getStat('atk', false, true) > pokemon.getStat('spa', false, true)) move.category = 'Physical'; }, ignoreAbility: true, - secondary: null, target: "normal", type: "Psychic", contestType: "Cool", @@ -13855,7 +13364,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Electric", contestType: "Cute", @@ -13870,7 +13378,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, multihit: [2, 5], - secondary: null, target: "normal", type: "Bug", zMove: { basePower: 140 }, @@ -13888,7 +13395,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, punch: 1 }, pseudoWeather: 'iondeluge', - secondary: null, target: "normal", type: "Electric", contestType: "Cool", @@ -13905,7 +13411,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { atk: -1, }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { def: 1 } }, @@ -13950,7 +13455,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (item.onEat) source.ateBerry = true; } }, - secondary: null, target: "any", type: "Flying", contestType: "Cute", @@ -13982,7 +13486,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, reflectable: 1, mirror: 1, metronome: 1 }, status: 'psn', - secondary: null, target: "allAdjacentFoes", type: "Poison", zMove: { boost: { def: 1 } }, @@ -14015,7 +13518,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, reflectable: 1, mirror: 1, metronome: 1, powder: 1 }, status: 'psn', - secondary: null, target: "normal", type: "Poison", zMove: { boost: { def: 1 } }, @@ -14085,7 +13587,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } } }, - secondary: null, target: "normal", type: "Bug", contestType: "Cute", @@ -14105,7 +13606,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onTryHit(target, source, move) { this.add('-activate', target, 'move: Poltergeist', this.dex.items.get(target.item).name); }, - secondary: null, target: "normal", type: "Ghost", }, @@ -14120,7 +13620,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: { contact: 1, protect: 1, mirror: 1, slicing: 1 }, multihit: 10, multiaccuracy: true, - secondary: null, target: "normal", type: "Normal", }, @@ -14152,7 +13651,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 35, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", contestType: "Tough", @@ -14183,7 +13681,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "normal", type: "Bug", zMove: { boost: { spd: 2 } }, @@ -14215,7 +13712,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Rock", contestType: "Beautiful", @@ -14256,7 +13752,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pokemon.removeVolatile('Power Shift'); }, }, - secondary: null, target: "self", type: "Normal", }, @@ -14278,7 +13773,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { source.storedStats.spa = newspa; this.add('-activate', source, 'move: Power Split', `[of] ${target}`); }, - secondary: null, target: "normal", type: "Psychic", zMove: { boost: { spe: 1 } }, @@ -14308,7 +13802,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-swapboost', source, target, 'atk, spa', '[from] move: Power Swap'); }, - secondary: null, target: "normal", type: "Psychic", zMove: { boost: { spe: 1 } }, @@ -14349,7 +13842,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pokemon.removeVolatile('Power Trick'); }, }, - secondary: null, target: "self", type: "Psychic", zMove: { boost: { atk: 1 } }, @@ -14369,7 +13861,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Dark", zMove: { basePower: 160 }, @@ -14407,7 +13898,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Grass", contestType: "Tough", @@ -14447,7 +13937,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { move.basePower = 120; } }, - secondary: null, target: "normal", type: "Normal", contestType: "Cute", @@ -14464,7 +13953,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { self: { volatileStatus: 'mustrecharge', }, - secondary: null, target: "normal", type: "Psychic", contestType: "Cool", @@ -14493,11 +13981,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { }, onTryHitPriority: 3, onTryHit(target, source, move) { - if (!move.flags['protect']) { - if (['gmaxoneblow', 'gmaxrapidflow'].includes(move.id)) return; - if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true; - return; - } + if (this.checkMoveBypassesProtect(move, source, target)) return; if (move.smartTarget) { move.smartTarget = false; } else { @@ -14513,7 +13997,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.NOT_FAIL; }, }, - secondary: null, target: "self", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -14545,7 +14028,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, slicing: 1 }, - secondary: null, onBasePower(basePower, source) { if (this.field.isTerrain('electricterrain')) { this.debug('psyblade electric terrain boost'); @@ -14589,7 +14071,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pokemon.side.removeSideCondition('lightscreen'); pokemon.side.removeSideCondition('auroraveil'); }, - secondary: null, target: "normal", type: "Psychic", contestType: "Clever", @@ -14638,7 +14119,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (!target.isGrounded()) { const baseMove = this.dex.moves.get(effect.id); if (baseMove.priority > 0) { - this.hint("Psychic Terrain doesn't affect Pokémon immune to Ground."); + this.hint("Psychic Terrain doesn't affect airborne Pokémon."); } return; } @@ -14665,7 +14146,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-fieldend', 'move: Psychic Terrain'); }, }, - secondary: null, target: "all", type: "Psychic", zMove: { boost: { spa: 1 } }, @@ -14685,7 +14165,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spa: -2, }, }, - secondary: null, target: "normal", type: "Psychic", contestType: "Clever", @@ -14700,7 +14179,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1, slicing: 1 }, critRatio: 2, - secondary: null, target: "normal", type: "Psychic", contestType: "Cool", @@ -14724,7 +14202,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pokemon.cureStatus(); }, }, - secondary: null, target: "normal", type: "Psychic", zMove: { boost: { spa: 2 } }, @@ -14758,7 +14235,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } this.add('-copyboost', source, target, '[from] move: Psych Up'); }, - secondary: null, target: "normal", type: "Normal", zMove: { effect: 'heal' }, @@ -14794,7 +14270,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Psychic", contestType: "Beautiful", @@ -14809,7 +14284,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Psychic", contestType: "Cool", @@ -14827,7 +14301,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Psychic", contestType: "Clever", @@ -14843,7 +14316,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1 }, isZ: "snorliumz", - secondary: null, target: "normal", type: "Normal", contestType: "Cool", @@ -14864,7 +14336,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Dark", zMove: { basePower: 160 }, @@ -14889,7 +14360,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } this.heal(Math.ceil(source.maxhp * 0.5), source); }, - secondary: null, target: "normal", type: "Poison", zMove: { boost: { atk: 1, def: 1, spa: 1, spd: 1, spe: 1 } }, @@ -14914,10 +14384,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 +14396,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) { @@ -14964,7 +14430,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "normal", type: "Dark", contestType: "Clever", @@ -15002,7 +14467,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { action.order = 201; this.add('-activate', target, 'move: Quash'); }, - secondary: null, target: "normal", type: "Dark", zMove: { boost: { spe: 1 } }, @@ -15017,7 +14481,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 30, priority: 1, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", contestType: "Cool", @@ -15048,11 +14511,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { // Quick Guard blocks moves with positive priority, even those given increased priority by Prankster or Gale Wings. // (e.g. it blocks 0 priority moves boosted by Prankster or Gale Wings; Quick Claw/Custap Berry do not count) if (move.priority <= 0.1) return; - if (!move.flags['protect']) { - if (['gmaxoneblow', 'gmaxrapidflow'].includes(move.id)) return; - if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true; - return; - } + if (this.checkMoveBypassesProtect(move, source, target)) return; this.add('-activate', target, 'move: Quick Guard'); const lockedmove = source.getVolatile('lockedmove'); if (lockedmove) { @@ -15064,7 +14523,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.NOT_FAIL; }, }, - secondary: null, target: "allySide", type: "Fighting", zMove: { boost: { def: 1 } }, @@ -15084,7 +14542,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spd: 1, spe: 1, }, - secondary: null, target: "self", type: "Bug", zMove: { effect: 'clearnegativeboost' }, @@ -15118,7 +14575,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pokemon.removeVolatile('rage'); }, }, - secondary: null, target: "normal", type: "Normal", contestType: "Tough", @@ -15135,7 +14591,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, punch: 1 }, - secondary: null, target: "normal", type: "Ghost", }, @@ -15169,7 +14624,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "self", type: "Bug", zMove: { effect: 'clearnegativeboost' }, @@ -15203,7 +14657,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { break; } }, - secondary: null, target: "normal", type: "Normal", }, @@ -15219,7 +14672,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { self: { volatileStatus: 'lockedmove', }, - secondary: null, target: "randomNormal", type: "Fire", }, @@ -15233,7 +14685,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { metronome: 1 }, weather: 'RainDance', - secondary: null, target: "all", type: "Water", zMove: { boost: { spe: 1 } }, @@ -15250,16 +14701,16 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, onAfterHit(target, pokemon, move) { if (!move.hasSheerForce) { - if (pokemon.hp && pokemon.removeVolatile('leechseed')) { + if (pokemon.removeVolatile('leechseed')) { this.add('-end', pokemon, 'Leech Seed', '[from] move: Rapid Spin', `[of] ${pokemon}`); } const sideConditions = ['spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge']; for (const condition of sideConditions) { - if (pokemon.hp && pokemon.side.removeSideCondition(condition)) { + if (pokemon.side.removeSideCondition(condition)) { this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Rapid Spin', `[of] ${pokemon}`); } } - if (pokemon.hp && pokemon.volatiles['partiallytrapped']) { + if (pokemon.volatiles['partiallytrapped']) { pokemon.removeVolatile('partiallytrapped'); } } @@ -15302,7 +14753,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1, slicing: 1 }, critRatio: 2, - secondary: null, target: "allAdjacentFoes", type: "Grass", contestType: "Cool", @@ -15348,7 +14798,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return null; }, critRatio: 2, - secondary: null, target: "allAdjacentFoes", type: "Normal", contestType: "Cool", @@ -15363,7 +14812,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { snatch: 1, heal: 1, metronome: 1 }, heal: [1, 2], - secondary: null, target: "self", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -15385,7 +14833,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-item', pokemon, this.dex.items.get(item), '[from] move: Recycle'); pokemon.setItem(item, source, move); }, - secondary: null, target: "self", type: "Normal", zMove: { boost: { spe: 2 } }, @@ -15427,7 +14874,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-sideend', side, 'Reflect'); }, }, - secondary: null, target: "allySide", type: "Psychic", zMove: { boost: { def: 1 } }, @@ -15460,7 +14906,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { source.knownType = target.isAlly(source) && target.knownType; if (!source.knownType) source.apparentType = oldApparentType; }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { spa: 1 } }, @@ -15480,7 +14925,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (['', 'slp', 'frz'].includes(pokemon.status)) return false; pokemon.cureStatus(); }, - secondary: null, target: "self", type: "Normal", zMove: { effect: 'heal' }, @@ -15547,7 +14991,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { target.statusState.startTime = 3; this.heal(target.maxhp); // Aesthetic only as the healing happens after you fall asleep in-game }, - secondary: null, target: "self", type: "Psychic", zMove: { effect: 'clearnegativeboost' }, @@ -15568,7 +15011,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.chainModify(2); } }, - secondary: null, target: "normal", type: "Normal", contestType: "Cool", @@ -15586,7 +15028,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", zMove: { basePower: 160 }, @@ -15609,7 +15050,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (type === '???' && types[1]) type = types[1]; move.type = type; }, - secondary: null, target: "normal", type: "Normal", contestType: "Beautiful", @@ -15634,7 +15074,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: -4, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Fighting", contestType: "Tough", @@ -15667,7 +15106,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Fighting", zMove: { basePower: 160 }, @@ -15697,7 +15135,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { duration: 1, // reviving implemented in side.ts, kind of }, - secondary: null, target: "self", type: "Normal", }, @@ -15717,7 +15154,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Electric", maxMove: { basePower: 140 }, @@ -15732,7 +15168,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: -6, flags: { reflectable: 1, mirror: 1, sound: 1, bypasssub: 1, allyanim: 1, metronome: 1, noassist: 1, failcopycat: 1 }, forceSwitch: true, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { def: 1 } }, @@ -15750,7 +15185,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { self: { volatileStatus: 'mustrecharge', }, - secondary: null, target: "normal", type: "Dragon", contestType: "Beautiful", @@ -15765,7 +15199,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1, bullet: 1 }, multihit: [2, 5], - secondary: null, target: "normal", type: "Rock", zMove: { basePower: 140 }, @@ -15802,7 +15235,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { spe: 2, }, - secondary: null, target: "self", type: "Rock", zMove: { effect: 'clearnegativeboost' }, @@ -15853,7 +15285,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Rock", contestType: "Tough", @@ -15889,7 +15320,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { self: { volatileStatus: 'mustrecharge', }, - secondary: null, target: "normal", type: "Rock", contestType: "Tough", @@ -15911,7 +15341,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { const oldAbility = source.setAbility(target.ability, target); if (!oldAbility) return oldAbility as false | null; }, - secondary: null, target: "normal", type: "Psychic", zMove: { boost: { spe: 1 } }, @@ -15996,7 +15425,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "normal", type: "Rock", contestType: "Cute", @@ -16032,7 +15460,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return types.filter(type => type !== 'Flying'); }, }, - secondary: null, target: "self", type: "Flying", zMove: { effect: 'clearnegativeboost' }, @@ -16067,7 +15494,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.boost({ atk: 1, spa: 1 }, pokemon, source); } }, - secondary: null, target: "all", type: "Ground", zMove: { boost: { atk: 1 } }, @@ -16098,7 +15524,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } } }, - secondary: null, target: "normal", type: "Normal", contestType: "Beautiful", @@ -16115,7 +15540,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Dark", contestType: "Tough", @@ -16148,7 +15572,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, slicing: 1 }, ignoreEvasion: true, ignoreDefensive: true, - secondary: null, target: "normal", type: "Fighting", contestType: "Cool", @@ -16178,7 +15601,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (effect.effectType === 'Move' && effect.infiltrates && !target.isAlly(source)) return; if (target !== source) { this.debug('interrupting setStatus'); - if (effect.name === 'Synchronize' || (effect.effectType === 'Move' && !effect.secondaries)) { + if (effect.id === 'synchronize' || (effect.effectType === 'Move' && !effect.secondaries)) { this.add('-activate', target, 'move: Safeguard'); } return null; @@ -16205,7 +15628,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-sideend', side, 'Safeguard'); }, }, - secondary: null, target: "allySide", type: "Normal", zMove: { boost: { spe: 1 } }, @@ -16252,7 +15674,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { accuracy: -1, }, - secondary: null, target: "normal", type: "Ground", zMove: { boost: { evasion: 1 } }, @@ -16289,7 +15710,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { metronome: 1, wind: 1 }, weather: 'Sandstorm', - secondary: null, target: "all", type: "Rock", zMove: { boost: { spe: 1 } }, @@ -16305,7 +15725,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, volatileStatus: 'partiallytrapped', - secondary: null, target: "normal", type: "Ground", contestType: "Clever", @@ -16324,7 +15743,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (target.hasType('Grass')) return null; target.addVolatile('leechseed', source); }, - secondary: null, target: "normal", type: "Grass", contestType: "Clever", @@ -16340,7 +15758,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "buginiumz", - secondary: null, target: "normal", type: "Bug", contestType: "Cool", @@ -16379,7 +15796,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spe: 1, }, }, - secondary: null, target: "normal", type: "Dragon", zMove: { basePower: 140 }, @@ -16397,7 +15813,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { spe: -2, }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { spe: 1 } }, @@ -16429,7 +15844,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 35, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", contestType: "Tough", @@ -16446,7 +15860,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { def: -2, }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { atk: 1 } }, @@ -16482,7 +15895,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: { contact: 1 }, isZ: "solganiumz", ignoreAbility: true, - secondary: null, target: "normal", type: "Steel", contestType: "Cool", @@ -16544,7 +15956,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { protect: 1, mirror: 1, slicing: 1 }, - secondary: null, target: "normal", type: "Fighting", contestType: "Beautiful", @@ -16558,7 +15969,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1, bullet: 1 }, - secondary: null, target: "normal", type: "Grass", contestType: "Tough", @@ -16592,7 +16002,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, nonsky: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Fighting", maxMove: { basePower: 75 }, @@ -16608,7 +16017,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1, noparentalbond: 1 }, selfdestruct: "always", - secondary: null, target: "allAdjacent", type: "Normal", contestType: "Beautiful", @@ -16662,7 +16070,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, critRatio: 2, - secondary: null, target: "normal", type: "Ghost", contestType: "Cool", @@ -16692,7 +16099,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { duration: 2, onInvulnerability: false, }, - secondary: null, target: "normal", type: "Ghost", contestType: "Cool", @@ -16706,7 +16112,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, punch: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Ghost", contestType: "Clever", @@ -16720,7 +16125,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 30, priority: 1, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Ghost", contestType: "Clever", @@ -16738,7 +16142,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { atk: 1, }, - secondary: null, target: "self", type: "Normal", zMove: { boost: { atk: 1 } }, @@ -16755,7 +16158,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "psychiumz", - secondary: null, target: "normal", type: "Psychic", contestType: "Cool", @@ -16793,7 +16195,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { }, }, selfSwitch: 'shedtail', - secondary: null, target: "self", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -16807,7 +16208,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, ohko: 'Ice', target: "normal", type: "Ice", @@ -16872,7 +16272,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spa: 2, spe: 2, }, - secondary: null, target: "self", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -16913,7 +16312,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "allAdjacentFoes", type: "Fire", contestType: "Tough", @@ -16930,7 +16328,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { def: 2, }, - secondary: null, target: "self", type: "Steel", }, @@ -16947,7 +16344,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spe: 2, atk: 1, }, - secondary: null, target: "self", type: "Steel", zMove: { effect: 'clearnegativeboost' }, @@ -16962,7 +16358,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Electric", contestType: "Cool", @@ -16988,7 +16383,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } return success; }, - secondary: null, target: "self", type: "Ground", zMove: { effect: 'clearnegativeboost' }, @@ -17036,10 +16430,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { }, onTryHitPriority: 3, onTryHit(target, source, move) { - if (!move.flags['protect'] || move.category === 'Status') { - if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true; - return; - } + if (this.checkMoveBypassesProtect(move, source, target, false)) return; if (move.smartTarget) { move.smartTarget = false; } else { @@ -17110,7 +16501,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { const oldAbility = target.setAbility('simple'); if (!oldAbility) return oldAbility as false | null; }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { spa: 1 } }, @@ -17126,7 +16516,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, reflectable: 1, mirror: 1, sound: 1, bypasssub: 1, metronome: 1 }, status: 'slp', - secondary: null, target: "normal", type: "Normal", zMove: { boost: { spe: 1 } }, @@ -17143,7 +16532,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "decidiumz", - secondary: null, target: "normal", type: "Ghost", contestType: "Cool", @@ -17198,7 +16586,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { source.baseMoveSlots[sketchIndex] = sketchedMove; this.add('-activate', source, 'move: Sketch', move.name); }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { atk: 1, def: 1, spa: 1, spd: 1, spe: 1 } }, @@ -17213,37 +16600,9 @@ 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", type: "Psychic", zMove: { boost: { spe: 1 } }, @@ -17289,7 +16648,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { attacker.addVolatile('twoturnmove', defender); return null; }, - secondary: null, target: "normal", type: "Normal", contestType: "Tough", @@ -17433,7 +16791,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "any", type: "Flying", contestType: "Tough", @@ -17448,7 +16805,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, punch: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Fighting", contestType: "Cool", @@ -17463,7 +16819,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { snatch: 1, heal: 1, metronome: 1 }, heal: [1, 2], - secondary: null, target: "self", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -17478,7 +16833,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, nonsky: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", contestType: "Tough", @@ -17493,7 +16847,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, slicing: 1 }, critRatio: 2, - secondary: null, target: "normal", type: "Normal", contestType: "Cool", @@ -17508,7 +16861,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, reflectable: 1, mirror: 1, metronome: 1, powder: 1 }, status: 'slp', - secondary: null, target: "normal", type: "Grass", zMove: { boost: { spe: 1 } }, @@ -17546,7 +16898,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.actions.useMove(randomMove, pokemon); }, callsMove: true, - secondary: null, target: "self", type: "Normal", zMove: { effect: 'crit2' }, @@ -17645,7 +16996,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { }, // groundedness implemented in battle.engine.js:BattlePokemon#isGrounded }, - secondary: null, target: "normal", type: "Rock", contestType: "Tough", @@ -17659,7 +17009,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Steel", contestType: "Cool", @@ -17684,7 +17033,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onHit(target) { if (target.status === 'par') target.cureStatus(); }, - secondary: null, target: "normal", type: "Normal", contestType: "Tough", @@ -17718,7 +17066,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { accuracy: -1, }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { evasion: 1 } }, @@ -17735,7 +17082,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1 }, volatileStatus: 'partiallytrapped', - secondary: null, target: "normal", type: "Grass", }, @@ -17787,7 +17133,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return null; }, }, - secondary: null, target: "self", type: "Dark", zMove: { boost: { spe: 2 } }, @@ -17804,7 +17149,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: { protect: 1, mirror: 1, metronome: 1 }, critRatio: 2, tracksTarget: true, - secondary: null, target: "normal", type: "Water", }, @@ -17839,7 +17183,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, weather: 'snowscape', - secondary: null, target: "all", type: "Ice", }, @@ -17861,7 +17204,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } this.add('-start', target, 'typechange', 'Water'); }, - secondary: null, target: "normal", type: "Water", zMove: { boost: { spa: 1 } }, @@ -17877,7 +17219,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { snatch: 1, heal: 1, metronome: 1 }, heal: [1, 2], - secondary: null, target: "self", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -17897,7 +17238,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return; } this.add('-prepare', attacker, move.name); - if (['sunnyday', 'desolateland'].includes(attacker.effectiveWeather())) { + if (['sunnyday', 'desolateland'].includes(attacker.effectiveWeather(true))) { this.attrLastMove('[still]'); this.addMove('-anim', attacker, move.name, defender); return; @@ -17915,7 +17256,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.chainModify(0.5); } }, - secondary: null, target: "normal", type: "Grass", contestType: "Cool", @@ -17934,7 +17274,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return; } this.add('-prepare', attacker, move.name); - if (['sunnyday', 'desolateland'].includes(attacker.effectiveWeather())) { + if (['sunnyday', 'desolateland'].includes(attacker.effectiveWeather(true))) { this.attrLastMove('[still]'); this.addMove('-anim', attacker, move.name, defender); return; @@ -17952,7 +17292,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.chainModify(0.5); } }, - secondary: null, target: "normal", type: "Grass", contestType: "Cool", @@ -17968,7 +17307,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", contestType: "Cool", @@ -17984,7 +17322,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1 }, isZ: "marshadiumz", - secondary: null, target: "normal", type: "Ghost", contestType: "Cool", @@ -17999,7 +17336,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, critRatio: 2, - secondary: null, target: "normal", type: "Dragon", contestType: "Beautiful", @@ -18074,7 +17410,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "normal", type: "Fairy", contestType: "Clever", @@ -18091,7 +17426,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: { contact: 1, protect: 1, mirror: 1, bypasssub: 1 }, stealsBoosts: true, // Boost stealing implemented in scripts.js - secondary: null, target: "normal", type: "Ghost", contestType: "Cool", @@ -18111,7 +17445,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { source.storedStats.spe = targetSpe; this.add('-activate', source, 'move: Speed Swap', `[of] ${target}`); }, - secondary: null, target: "normal", type: "Psychic", zMove: { boost: { spe: 1 } }, @@ -18130,7 +17463,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { atk: 2, def: -2, }, - secondary: null, target: "normal", type: "Grass", }, @@ -18147,7 +17479,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onHit(target, source, move) { return target.addVolatile('trapped', source, move, 'trapper'); }, - secondary: null, target: "normal", type: "Bug", zMove: { boost: { def: 1 } }, @@ -18164,7 +17495,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, multihit: [2, 5], - secondary: null, target: "normal", type: "Normal", maxMove: { basePower: 120 }, @@ -18197,7 +17527,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.damage(damageAmounts[this.effectState.layers] * pokemon.maxhp / 24); }, }, - secondary: null, target: "foeSide", type: "Ground", zMove: { boost: { def: 1 } }, @@ -18227,11 +17556,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { }, onTryHitPriority: 3, onTryHit(target, source, move) { - if (!move.flags['protect']) { - if (['gmaxoneblow', 'gmaxrapidflow'].includes(move.id)) return; - if (move.isZ || move.isMax) target.getMoveHitData(move).zBrokeProtect = true; - return; - } + if (this.checkMoveBypassesProtect(move, source, target)) return; if (move.smartTarget) { move.smartTarget = false; } else { @@ -18255,7 +17580,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "self", type: "Grass", zMove: { boost: { def: 1 } }, @@ -18275,7 +17599,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spe: -2, }, }, - secondary: null, target: "normal", type: "Steel", }, @@ -18334,7 +17657,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (!ppDeducted) return false; this.add("-activate", target, 'move: Spite', move.name, ppDeducted); }, - secondary: null, target: "normal", type: "Ghost", zMove: { effect: 'heal' }, @@ -18359,7 +17681,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onAfterMove(pokemon) { pokemon.removeVolatile('stockpile'); }, - secondary: null, target: "normal", type: "Normal", contestType: "Tough", @@ -18383,7 +17704,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onTryHit(target, source) { this.add('-nothing'); }, - secondary: null, target: "self", type: "Normal", zMove: { boost: { atk: 3 } }, @@ -18406,7 +17726,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.field.clearTerrain(); }, isZ: "lycaniumz", - secondary: null, target: "normal", type: "Rock", contestType: "Cool", @@ -18439,7 +17758,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, reflectable: 1, mirror: 1, metronome: 1, powder: 1 }, status: 'slp', - secondary: null, target: "normal", type: "Grass", zMove: { effect: 'clearnegativeboost' }, @@ -18473,7 +17791,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { spd: 1 } }, @@ -18518,7 +17835,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.damage(pokemon.maxhp * (2 ** typeMod) / 8); }, }, - secondary: null, target: "foeSide", type: "Rock", zMove: { boost: { def: 1 } }, @@ -18551,7 +17867,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { name: "Steamroller", pp: 20, priority: 0, - flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, minimize: 1 }, secondary: { chance: 30, volatileStatus: 'flinch', @@ -18579,7 +17895,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } } }, - secondary: null, target: "normal", type: "Steel", }, @@ -18601,7 +17916,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onAfterSubDamage() { this.field.clearTerrain(); }, - secondary: null, target: "normal", type: "Steel", }, @@ -18646,7 +17960,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.boost({ spe: -1 }, pokemon, pokemon.side.foe.active[0], this.dex.getActiveMove('stickyweb')); }, }, - secondary: null, target: "foeSide", type: "Bug", zMove: { boost: { spe: 1 } }, @@ -18700,7 +18013,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "self", type: "Normal", zMove: { effect: 'heal' }, @@ -18733,7 +18045,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { name: "Stomp", pp: 20, priority: 0, - flags: { contact: 1, protect: 1, mirror: 1, nonsky: 1, metronome: 1 }, + flags: { contact: 1, protect: 1, mirror: 1, nonsky: 1, metronome: 1, minimize: 1 }, secondary: { chance: 30, volatileStatus: 'flinch', @@ -18758,7 +18070,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Ground", contestType: "Tough", @@ -18773,7 +18084,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, slicing: 1 }, onAfterHit(target, source, move) { - if (!move.hasSheerForce && source.hp) { + if (!move.hasSheerForce) { for (const side of source.side.foeSidesWithConditions()) { side.addSideCondition('stealthrock'); } @@ -18800,7 +18111,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, critRatio: 2, - secondary: null, target: "normal", type: "Rock", contestType: "Tough", @@ -18819,7 +18129,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Psychic", zMove: { basePower: 160 }, @@ -18837,7 +18146,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, willCrit: true, - secondary: null, target: "normal", type: "Fighting", contestType: "Cool", @@ -18867,7 +18175,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", contestType: "Tough", @@ -18887,7 +18194,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { const success = this.boost({ atk: -1 }, target, source, null, false, true); return !!(this.heal(atk, source, target) || success); }, - secondary: null, target: "normal", type: "Grass", zMove: { boost: { def: 1 } }, @@ -18905,7 +18211,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { spe: -2, }, - secondary: null, target: "allAdjacentFoes", type: "Bug", zMove: { boost: { spe: 1 } }, @@ -18929,7 +18234,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-activate', pokemon, 'move: Struggle'); }, struggleRecoil: true, - secondary: null, target: "randomNormal", type: "Normal", contestType: "Tough", @@ -18972,7 +18276,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (!this.boost({ def: 2 })) return null; pokemon.eatItem(true); }, - secondary: null, target: "self", type: "Normal", }, @@ -18986,7 +18289,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, reflectable: 1, mirror: 1, metronome: 1, powder: 1 }, status: 'par', - secondary: null, target: "normal", type: "Grass", zMove: { boost: { spd: 1 } }, @@ -19003,7 +18305,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, recoil: [1, 4], - secondary: null, target: "normal", type: "Fighting", contestType: "Cool", @@ -19080,7 +18381,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-end', target, 'Substitute'); }, }, - secondary: null, target: "self", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -19097,7 +18397,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "iciumz", - secondary: null, target: "normal", type: "Ice", contestType: "Cool", @@ -19118,7 +18417,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return false; } }, - secondary: null, target: "normal", type: "Dark", contestType: "Clever", @@ -19133,7 +18431,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { metronome: 1 }, weather: 'sunnyday', - secondary: null, target: "all", type: "Fire", zMove: { boost: { spe: 1 } }, @@ -19149,7 +18446,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1 }, ignoreAbility: true, - secondary: null, target: "normal", type: "Steel", contestType: "Cool", @@ -19162,12 +18458,11 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { name: "Supercell Slam", pp: 15, priority: 0, - flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, + flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, minimize: 1 }, hasCrashDamage: true, onMoveFail(target, source, move) { this.damage(source.baseMaxhp / 2, source, source, this.dex.conditions.get('Supercell Slam')); }, - secondary: null, target: "normal", type: "Electric", }, @@ -19183,7 +18478,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", contestType: "Tough", @@ -19203,7 +18497,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { def: -1, }, }, - secondary: null, target: "normal", type: "Fighting", contestType: "Tough", @@ -19218,7 +18511,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, reflectable: 1, mirror: 1, sound: 1, bypasssub: 1, metronome: 1 }, volatileStatus: 'confusion', - secondary: null, target: "normal", type: "Normal", zMove: { boost: { spe: 1 } }, @@ -19235,7 +18527,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "flyiniumz", - secondary: null, target: "normal", type: "Flying", contestType: "Cool", @@ -19249,7 +18540,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { protect: 1, mirror: 1, nonsky: 1, metronome: 1 }, - secondary: null, target: "allAdjacent", type: "Water", contestType: "Beautiful", @@ -19265,7 +18555,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: { contact: 1, protect: 1, mirror: 1, punch: 1 }, willCrit: true, multihit: 3, - secondary: null, target: "normal", type: "Water", zMove: { basePower: 140 }, @@ -19284,7 +18573,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { atk: 2, }, - secondary: null, target: "normal", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -19311,7 +18599,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pokemon.removeVolatile('stockpile'); return success || this.NOT_FAIL; }, - secondary: null, target: "self", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -19327,7 +18614,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, reflectable: 1, mirror: 1, metronome: 1 }, volatileStatus: 'confusion', - secondary: null, target: "normal", type: "Fairy", zMove: { boost: { spa: 1 } }, @@ -19345,7 +18631,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { evasion: -2, }, - secondary: null, target: "allAdjacentFoes", type: "Normal", zMove: { boost: { accuracy: 1 } }, @@ -19360,7 +18645,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "allAdjacentFoes", type: "Normal", contestType: "Cool", @@ -19380,7 +18664,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onHit(target, source, move) { const yourItem = target.takeItem(source); const myItem = source.takeItem(); - if (target.item || source.item || (!yourItem && !myItem)) { + if (yourItem === false || myItem === false || (!yourItem && !myItem)) { if (yourItem) target.item = yourItem.id; if (myItem) source.item = myItem.id; return false; @@ -19407,7 +18691,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-enditem', source, myItem, '[silent]', '[from] move: Switcheroo'); } }, - secondary: null, target: "normal", type: "Dark", zMove: { boost: { spe: 2 } }, @@ -19425,7 +18708,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { atk: 2, }, - secondary: null, target: "self", type: "Normal", zMove: { effect: 'clearnegativeboost' }, @@ -19444,7 +18726,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onTryImmunity(target, source) { return target.hasType(source.getTypes()); }, - secondary: null, target: "allAdjacent", type: "Psychic", contestType: "Clever", @@ -19480,7 +18761,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } return success; }, - secondary: null, target: "self", type: "Grass", zMove: { effect: 'clearnegativeboost' }, @@ -19531,7 +18811,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1, slicing: 1 }, multihit: 2, - secondary: null, target: "normal", type: "Steel", zMove: { basePower: 180 }, @@ -19547,7 +18826,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 35, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", contestType: "Tough", @@ -19564,7 +18842,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { spa: 3, }, - secondary: null, target: "self", type: "Bug", zMove: { effect: 'clearnegativeboost' }, @@ -19580,7 +18857,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, multihit: [2, 5], - secondary: null, target: "normal", type: "Normal", zMove: { basePower: 140 }, @@ -19599,7 +18875,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { def: -1, }, - secondary: null, target: "allAdjacentFoes", type: "Normal", zMove: { boost: { atk: 1 } }, @@ -19640,7 +18915,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-sideend', side, 'move: Tailwind'); }, }, - secondary: null, target: "allySide", type: "Flying", zMove: { effect: 'crit2' }, @@ -19656,7 +18930,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, recoil: [1, 4], - secondary: null, target: "normal", type: "Normal", contestType: "Tough", @@ -19674,7 +18947,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { const success = !!this.boost({ spa: 1, spd: 1 }); return pokemon.cureStatus() || success; }, - secondary: null, target: "self", type: "Psychic", }, @@ -19704,7 +18976,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { spe: -1, }, - secondary: null, target: "normal", type: "Rock", }, @@ -19746,7 +19017,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "normal", type: "Dark", zMove: { boost: { atk: 1 } }, @@ -19765,7 +19035,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { atk: -1, spa: -1, }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { def: 1 } }, @@ -19799,7 +19068,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pokemon.eatItem(true); } }, - secondary: null, target: "all", type: "Normal", }, @@ -19817,7 +19085,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (pokemon.ignoringItem()) return; move.type = this.runEvent('Drive', pokemon, null, move, 'Normal'); }, - secondary: null, target: "normal", type: "Normal", contestType: "Cool", @@ -19833,7 +19100,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "groundiumz", - secondary: null, target: "normal", type: "Ground", contestType: "Cool", @@ -19848,7 +19114,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, dance: 1, metronome: 1 }, volatileStatus: 'confusion', - secondary: null, target: "allAdjacent", type: "Normal", zMove: { boost: { spa: 1 } }, @@ -19902,7 +19167,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-end', target, 'Telekinesis'); }, }, - secondary: null, target: "normal", type: "Psychic", zMove: { boost: { spa: 1 } }, @@ -19921,7 +19185,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return !!this.canSwitch(source.side); }, selfSwitch: true, - secondary: null, target: "self", type: "Psychic", zMove: { effect: 'heal' }, @@ -19943,7 +19206,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Fire", }, @@ -19980,7 +19242,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { move.self = { boosts: { atk: -1, spa: -1 } }; } }, - secondary: null, target: "normal", type: "Normal", }, @@ -20006,7 +19267,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { move.target = 'allAdjacentFoes'; } }, - secondary: null, target: "normal", type: "Normal", }, @@ -20042,7 +19302,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.debug('BP doubled in Terrain'); } }, - secondary: null, target: "normal", type: "Normal", zMove: { basePower: 160 }, @@ -20073,7 +19332,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-enditem', target, yourItem, '[silent]', '[from] move: Thief', `[of] ${source}`); this.add('-item', source, yourItem, '[from] move: Thief', `[of] ${target}`); }, - secondary: null, target: "normal", type: "Dark", contestType: "Tough", @@ -20098,7 +19356,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { }, volatileStatus: 'smackdown', ignoreImmunity: { 'Ground': true }, - secondary: null, target: "allAdjacentFoes", type: "Ground", zMove: { basePower: 180 }, @@ -20117,7 +19374,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onHit(target, source, move) { if (source.isActive) target.addVolatile('trapped', source, move, 'trapper'); }, - secondary: null, target: "allAdjacentFoes", type: "Ground", contestType: "Tough", @@ -20134,7 +19390,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { self: { volatileStatus: 'lockedmove', }, - secondary: null, target: "randomNormal", type: "Normal", contestType: "Tough", @@ -20244,7 +19499,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1 }, volatileStatus: 'partiallytrapped', - secondary: null, target: "normal", type: "Electric", }, @@ -20264,7 +19518,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return false; } }, - secondary: null, target: "normal", type: "Electric", contestType: "Clever", @@ -20354,7 +19607,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: { protect: 1, reflectable: 1, mirror: 1, metronome: 1 }, status: 'par', ignoreImmunity: false, - secondary: null, target: "normal", type: "Electric", zMove: { boost: { spd: 1 } }, @@ -20373,7 +19625,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { atk: -1, def: -1, }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { def: 1 } }, @@ -20406,7 +19657,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (success) this.add('-activate', pokemon, 'move: Tidy Up'); return !!this.boost({ atk: 1, spe: 1 }, pokemon, pokemon, null, false, true) || success; }, - secondary: null, target: "self", type: "Normal", }, @@ -20430,7 +19680,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (!success) return false; this.add('-invertboost', target, '[from] move: Topsy-Turvy'); }, - secondary: null, target: "normal", type: "Dark", zMove: { boost: { atk: 1 } }, @@ -20484,7 +19733,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (pokemon.lastMove && pokemon.lastMove.id !== 'struggle') pokemon.disableMove(pokemon.lastMove.id); }, }, - secondary: null, target: "normal", type: "Dark", zMove: { boost: { def: 1 } }, @@ -20501,7 +19749,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: { protect: 1, reflectable: 1, mirror: 1, metronome: 1 }, // No Guard-like effect for Poison-type users implemented in Scripts#tryMoveHit status: 'tox', - secondary: null, target: "normal", type: "Poison", zMove: { boost: { def: 1 } }, @@ -20542,7 +19789,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "foeSide", type: "Poison", zMove: { boost: { def: 1 } }, @@ -20561,7 +19807,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { spe: -1, }, - secondary: null, target: "normal", type: "Poison", zMove: { boost: { spe: 1 } }, @@ -20602,7 +19847,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return false; } }, - secondary: null, target: "normal", type: "Normal", zMove: { effect: 'heal' }, @@ -20620,14 +19864,8 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { secondary: { chance: 20, onHit(target, source) { - const result = this.random(3); - if (result === 0) { - target.trySetStatus('brn', source); - } else if (result === 1) { - target.trySetStatus('par', source); - } else { - target.trySetStatus('frz', source); - } + const status = this.sample(['brn', 'par', 'frz']); + target.trySetStatus(status, source); }, }, target: "normal", @@ -20649,7 +19887,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onHit(target, source, move) { const yourItem = target.takeItem(source); const myItem = source.takeItem(); - if (target.item || source.item || (!yourItem && !myItem)) { + if (yourItem === false || myItem === false || (!yourItem && !myItem)) { if (yourItem) target.item = yourItem.id; if (myItem) source.item = myItem.id; return false; @@ -20676,7 +19914,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-enditem', source, myItem, '[silent]', '[from] move: Trick'); } }, - secondary: null, target: "normal", type: "Psychic", zMove: { boost: { spe: 2 } }, @@ -20705,7 +19942,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } } }, - secondary: null, target: "normal", type: "Ghost", zMove: { boost: { atk: 1, def: 1, spa: 1, spd: 1, spe: 1 } }, @@ -20747,7 +19983,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-fieldend', 'move: Trick Room'); }, }, - secondary: null, target: "all", type: "Psychic", zMove: { boost: { accuracy: 1 } }, @@ -20791,7 +20026,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, multihit: 3, multiaccuracy: true, - secondary: null, target: "normal", type: "Ice", zMove: { basePower: 120 }, @@ -20807,7 +20041,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, multihit: 3, - secondary: null, target: "normal", type: "Water", }, @@ -20825,7 +20058,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, multihit: 3, multiaccuracy: true, - secondary: null, target: "normal", type: "Fighting", zMove: { basePower: 120 }, @@ -20888,10 +20120,8 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { isNonstandard: "Past", name: "Trump Card", pp: 5, - noPPBoosts: true, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", zMove: { basePower: 160 }, @@ -20908,7 +20138,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1 }, multihit: 2, - secondary: null, target: "normal", type: "Psychic", contestType: "Cool", @@ -20944,7 +20173,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: {}, isZ: "fairiumz", - secondary: null, target: "normal", type: "Fairy", contestType: "Cool", @@ -21043,7 +20271,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "randomNormal", type: "Normal", contestType: "Cute", @@ -21058,7 +20285,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, selfSwitch: true, - secondary: null, target: "normal", type: "Bug", contestType: "Cute", @@ -21072,7 +20298,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 30, priority: 1, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Fighting", contestType: "Cool", @@ -21094,7 +20319,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { spd: -1, }, }, - secondary: null, target: "normal", type: "Fire", zMove: { basePower: 220 }, @@ -21115,7 +20339,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 20, priority: 0, flags: { contact: 1, protect: 1, mirror: 1 }, - secondary: null, target: "normal", type: "Normal", contestType: "Cute", @@ -21136,7 +20359,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } return false; }, - secondary: null, target: "allAdjacentFoes", type: "Poison", zMove: { boost: { def: 1 } }, @@ -21156,7 +20378,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.chainModify(2); } }, - secondary: null, target: "normal", type: "Poison", contestType: "Beautiful", @@ -21175,7 +20396,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { def: 1, spe: 1, }, - secondary: null, target: "self", type: "Fighting", }, @@ -21188,7 +20408,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 25, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Grass", contestType: "Cool", @@ -21202,7 +20421,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 30, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", contestType: "Tough", @@ -21217,7 +20435,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 10, priority: -1, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Fighting", contestType: "Cool", @@ -21232,7 +20449,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, selfSwitch: true, - secondary: null, target: "normal", type: "Electric", contestType: "Cool", @@ -21275,7 +20491,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { onHit(target) { if (target.status === 'slp') target.cureStatus(); }, - secondary: null, target: "normal", type: "Fighting", contestType: "Tough", @@ -21306,7 +20521,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 25, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Water", contestType: "Cute", @@ -21378,7 +20592,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "normal", type: "Water", contestType: "Beautiful", @@ -21417,7 +20630,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 1, flags: { protect: 1, mirror: 1, metronome: 1 }, multihit: [2, 5], - secondary: null, target: "normal", type: "Water", contestType: "Cool", @@ -21451,7 +20663,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-fieldend', 'move: Water Sport'); }, }, - secondary: null, target: "all", type: "Water", zMove: { boost: { spd: 1 } }, @@ -21471,7 +20682,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "allAdjacentFoes", type: "Water", contestType: "Beautiful", @@ -21486,7 +20696,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, recoil: [33, 100], - secondary: null, target: "normal", type: "Water", }, @@ -21538,7 +20747,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } this.debug(`BP: ${move.basePower}`); }, - secondary: null, target: "normal", type: "Normal", zMove: { basePower: 160 }, @@ -21555,7 +20763,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, mirror: 1, metronome: 1 }, volatileStatus: 'partiallytrapped', - secondary: null, target: "normal", type: "Water", contestType: "Beautiful", @@ -21570,7 +20777,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: -6, flags: { reflectable: 1, mirror: 1, bypasssub: 1, allyanim: 1, metronome: 1, noassist: 1, failcopycat: 1, wind: 1 }, forceSwitch: true, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { spd: 1 } }, @@ -21586,7 +20792,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, punch: 1 }, willCrit: true, - secondary: null, target: "normal", type: "Dark", }, @@ -21637,11 +20842,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (move?.target !== 'allAdjacent' && move.target !== 'allAdjacentFoes') { return; } - if (move.isZ || move.isMax) { - if (['gmaxoneblow', 'gmaxrapidflow'].includes(move.id)) return; - target.getMoveHitData(move).zBrokeProtect = true; - return; - } + if (this.checkMoveBypassesProtect(move, source, target)) return; this.add('-activate', target, 'move: Wide Guard'); const lockedmove = source.getVolatile('lockedmove'); if (lockedmove) { @@ -21653,7 +20854,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { return this.NOT_FAIL; }, }, - secondary: null, target: "allySide", type: "Rock", zMove: { boost: { def: 1 } }, @@ -21690,7 +20890,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, recoil: [1, 4], - secondary: null, target: "normal", type: "Electric", contestType: "Tough", @@ -21705,7 +20904,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { protect: 1, reflectable: 1, mirror: 1, metronome: 1 }, status: 'brn', - secondary: null, target: "normal", type: "Fire", zMove: { boost: { atk: 1 } }, @@ -21720,7 +20918,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 35, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, distance: 1, metronome: 1 }, - secondary: null, target: "any", type: "Flying", contestType: "Cool", @@ -21757,7 +20954,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { } }, }, - secondary: null, target: "self", type: "Normal", zMove: { boost: { spd: 1 } }, @@ -21775,7 +20971,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { boosts: { def: 1, }, - secondary: null, target: "self", type: "Water", zMove: { boost: { def: 1 } }, @@ -21825,7 +21020,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { this.add('-fieldend', 'move: Wonder Room'); }, }, - secondary: null, target: "all", type: "Psychic", zMove: { boost: { spd: 1 } }, @@ -21841,7 +21035,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, recoil: [33, 100], - secondary: null, target: "normal", type: "Grass", contestType: "Tough", @@ -21859,7 +21052,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { atk: 1, spa: 1, }, - secondary: null, target: "self", type: "Normal", zMove: { boost: { atk: 1 } }, @@ -21891,7 +21083,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { if (!oldAbility) return oldAbility as false | null; if (target.status === 'slp') target.cureStatus(); }, - secondary: null, target: "normal", type: "Grass", zMove: { boost: { spe: 1 } }, @@ -21907,7 +21098,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, volatileStatus: 'partiallytrapped', - secondary: null, target: "normal", type: "Normal", contestType: "Tough", @@ -21929,7 +21119,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 5, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 }, - secondary: null, target: "normal", type: "Normal", zMove: { basePower: 190 }, @@ -21945,7 +21134,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { pp: 15, priority: 0, flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, slicing: 1 }, - secondary: null, target: "normal", type: "Bug", contestType: "Cool", @@ -21977,7 +21165,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = { target.trySetStatus('slp', this.effectState.source); }, }, - secondary: null, target: "normal", type: "Normal", zMove: { boost: { spe: 1 } }, diff --git a/data/pokedex.ts b/data/pokedex.ts index 15f545e973..8ced11d3b9 100644 --- a/data/pokedex.ts +++ b/data/pokedex.ts @@ -1039,7 +1039,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { types: ["Fairy", "Flying"], genderRatio: { M: 0.25, F: 0.75 }, baseStats: { hp: 95, atk: 80, def: 93, spa: 135, spd: 110, spe: 70 }, - abilities: { 0: "Cute Charm", 1: "Magic Guard", H: "Unaware" }, + abilities: { 0: "Magic Bounce" }, heightm: 1.7, weightkg: 42.3, color: "Pink", @@ -1723,7 +1723,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { forme: "Mega", types: ["Grass", "Poison"], baseStats: { hp: 80, atk: 125, def: 85, spa: 135, spd: 95, spe: 70 }, - abilities: { 0: "Chlorophyll", H: "Gluttony" }, + abilities: { 0: "Innards Out" }, heightm: 4.5, weightkg: 125.5, color: "Green", @@ -2736,9 +2736,8 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { forme: "Mega", types: ["Water", "Psychic"], gender: "N", - // FIXME: change stats on generation shift - baseStats: { hp: 60, atk: 140, def: 105, spa: 130, spd: 105, spe: 120 }, - abilities: { 0: "Illuminate", 1: "Natural Cure", H: "Analytic" }, + baseStats: { hp: 60, atk: 100, def: 105, spa: 130, spd: 105, spe: 120 }, + abilities: { 0: "Huge Power" }, heightm: 2.3, weightkg: 80, color: "Purple", @@ -3352,7 +3351,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { forme: "Mega", types: ["Dragon", "Flying"], baseStats: { hp: 91, atk: 124, def: 115, spa: 145, spd: 125, spe: 100 }, - abilities: { 0: "Inner Focus", H: "Multiscale" }, + abilities: { 0: "Multiscale" }, heightm: 2.2, weightkg: 290, color: "Brown", @@ -3470,7 +3469,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { types: ["Grass", "Fairy"], genderRatio: { M: 0.875, F: 0.125 }, baseStats: { hp: 80, atk: 92, def: 115, spa: 143, spd: 115, spe: 80 }, - abilities: { 0: "Overgrow", H: "Leaf Guard" }, + abilities: { 0: "Mega Sol" }, heightm: 2.4, weightkg: 201, color: "Green", @@ -3590,7 +3589,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { types: ["Water", "Dragon"], genderRatio: { M: 0.875, F: 0.125 }, baseStats: { hp: 85, atk: 160, def: 125, spa: 89, spd: 93, spe: 78 }, - abilities: { 0: "Torrent", H: "Sheer Force" }, + abilities: { 0: "Dragonize" }, heightm: 2.3, weightkg: 108.8, color: "Blue", @@ -4636,7 +4635,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { forme: "Mega", types: ["Steel", "Flying"], baseStats: { hp: 65, atk: 140, def: 110, spa: 40, spd: 100, spe: 110 }, - abilities: { 0: "Keen Eye", 1: "Sturdy", H: "Weak Armor" }, + abilities: { 0: "Stalwart" }, heightm: 1.7, weightkg: 40.4, color: "Gray", @@ -8708,7 +8707,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { types: ["Ice", "Ghost"], gender: "F", baseStats: { hp: 70, atk: 80, def: 70, spa: 140, spd: 100, spe: 120 }, - abilities: { 0: "Snow Cloak", H: "Cursed Body" }, + abilities: { 0: "Snow Warning" }, heightm: 2.6, weightkg: 29.6, color: "White", @@ -9484,7 +9483,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { types: ["Fire", "Fighting"], genderRatio: { M: 0.875, F: 0.125 }, baseStats: { hp: 110, atk: 148, def: 75, spa: 110, spd: 110, spe: 75 }, - abilities: { 0: "Blaze", H: "Reckless" }, + abilities: { 0: "Mold Breaker" }, heightm: 1.8, weightkg: 180.3, color: "Red", @@ -9913,7 +9912,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { forme: "Mega", types: ["Ground", "Steel"], baseStats: { hp: 110, atk: 165, def: 100, spa: 65, spd: 65, spe: 103 }, - abilities: { 0: "Sand Rush", 1: "Sand Force", H: "Mold Breaker" }, + abilities: { 0: "Piercing Drill" }, heightm: 0.9, weightkg: 60, color: "Gray", @@ -11144,7 +11143,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { baseStats: { hp: 85, atk: 145, def: 80, spa: 135, spd: 90, spe: 80 }, abilities: { 0: "Levitate" }, heightm: 3, - weightkg: 160, + weightkg: 180, color: "Blue", eggGroups: ["Amorphous"], requiredItem: "Eelektrossite", @@ -11224,7 +11223,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { forme: "Mega", types: ["Ghost", "Fire"], baseStats: { hp: 60, atk: 75, def: 110, spa: 175, spd: 110, spe: 90 }, - abilities: { 0: "Flash Fire", 1: "Flame Body", H: "Infiltrator" }, + abilities: { 0: "Infiltrator" }, heightm: 2.5, weightkg: 69.6, color: "Black", @@ -11433,7 +11432,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { types: ["Ground", "Ghost"], gender: "N", baseStats: { hp: 89, atk: 159, def: 105, spa: 70, spd: 105, spe: 55 }, - abilities: { 0: "Iron Fist", 1: "Klutz", H: "No Guard" }, + abilities: { 0: "Unseen Fist" }, heightm: 4, weightkg: 330, color: "Green", @@ -12034,7 +12033,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { types: ["Grass", "Fighting"], genderRatio: { M: 0.875, F: 0.125 }, baseStats: { hp: 88, atk: 137, def: 172, spa: 74, spd: 115, spe: 44 }, - abilities: { 0: "Overgrow", H: "Bulletproof" }, + abilities: { 0: "Bulletproof" }, heightm: 1.6, weightkg: 90, color: "Green", @@ -12094,7 +12093,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { types: ["Fire", "Psychic"], genderRatio: { M: 0.875, F: 0.125 }, baseStats: { hp: 75, atk: 69, def: 72, spa: 159, spd: 125, spe: 134 }, - abilities: { 0: "Blaze", H: "Magician" }, + abilities: { 0: "Levitate" }, heightm: 1.5, weightkg: 39, color: "Red", @@ -12186,7 +12185,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { types: ["Water", "Dark"], genderRatio: { M: 0.875, F: 0.125 }, baseStats: { hp: 72, atk: 125, def: 77, spa: 133, spd: 81, spe: 142 }, - abilities: { 0: "Torrent", H: "Protean" }, + abilities: { 0: "Protean" }, heightm: 1.5, weightkg: 40, color: "Blue", @@ -12573,7 +12572,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { types: ["Fairy"], gender: "F", baseStats: { hp: 74, atk: 85, def: 87, spa: 155, spd: 148, spe: 102 }, - abilities: { 0: "Flower Veil", H: "Symbiosis" }, + abilities: { 0: "Fairy Aura" }, heightm: 0.2, weightkg: 100.8, color: "White", @@ -12729,7 +12728,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { types: ["Psychic"], gender: "M", baseStats: { hp: 74, atk: 48, def: 76, spa: 143, spd: 101, spe: 124 }, - abilities: { 0: "Keen Eye", 1: "Infiltrator", H: "Competitive" }, + abilities: { 0: "Trace" }, heightm: 0.8, weightkg: 10.1, color: "Blue", @@ -12746,7 +12745,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { types: ["Psychic"], gender: "F", baseStats: { hp: 74, atk: 48, def: 76, spa: 143, spd: 101, spe: 124 }, - abilities: { 0: "Keen Eye", 1: "Infiltrator", H: "Competitive" }, + abilities: { 0: "Trace" }, heightm: 0.8, weightkg: 10.1, color: "White", @@ -13134,7 +13133,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { forme: "Mega", types: ["Fighting", "Flying"], baseStats: { hp: 78, atk: 137, def: 100, spa: 74, spd: 93, spe: 118 }, - abilities: { 0: "Limber", 1: "Unburden", H: "Mold Breaker" }, + abilities: { 0: "No Guard" }, heightm: 1, weightkg: 25, color: "Green", @@ -13960,7 +13959,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { forme: "Mega", types: ["Fighting", "Ice"], baseStats: { hp: 97, atk: 157, def: 122, spa: 62, spd: 107, spe: 33 }, - abilities: { 0: "Hyper Cutter", 1: "Iron Fist", H: "Anger Point" }, + abilities: { 0: "Iron Fist" }, heightm: 2.6, weightkg: 252.8, color: "White", @@ -15075,9 +15074,9 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { forme: "Mega", types: ["Normal", "Dragon"], baseStats: { hp: 78, atk: 85, def: 110, spa: 160, spd: 116, spe: 36 }, - abilities: { 0: "Berserk", 1: "Sap Sipper", H: "Cloud Nine" }, + abilities: { 0: "Berserk" }, heightm: 3, - weightkg: 185, + weightkg: 240.5, color: "White", eggGroups: ["Monster", "Dragon"], requiredItem: "Drampanite", @@ -18281,7 +18280,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { forme: "Mega", types: ["Grass", "Fire"], baseStats: { hp: 65, atk: 138, def: 85, spa: 138, spd: 85, spe: 75 }, - abilities: { 0: "Chlorophyll", 1: "Insomnia", H: "Moody" }, + abilities: { 0: "Spicy Spray" }, heightm: 1.2, weightkg: 22, color: "Green", @@ -18541,7 +18540,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { forme: "Mega", types: ["Rock", "Poison"], baseStats: { hp: 83, atk: 90, def: 105, spa: 150, spd: 96, spe: 101 }, - abilities: { 0: "Toxic Debris", H: "Corrosion" }, + abilities: { 0: "Adaptability" }, heightm: 2.8, weightkg: 77, color: "Blue", @@ -18682,7 +18681,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { baseStats: { hp: 68, atk: 65, def: 90, spa: 135, spd: 125, spe: 92 }, abilities: { 0: "Commander", H: "Storm Drain" }, heightm: 0.3, - weightkg: 8, + weightkg: 24, color: "Red", eggGroups: ["Water 2"], requiredItem: "Tatsugirinite", @@ -18697,7 +18696,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { baseStats: { hp: 68, atk: 65, def: 90, spa: 135, spd: 125, spe: 92 }, abilities: { 0: "Commander", H: "Storm Drain" }, heightm: 0.3, - weightkg: 8, + weightkg: 24, color: "Pink", eggGroups: ["Water 2"], requiredItem: "Tatsugirinite", @@ -18712,7 +18711,7 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { baseStats: { hp: 68, atk: 65, def: 90, spa: 135, spd: 125, spe: 92 }, abilities: { 0: "Commander", H: "Storm Drain" }, heightm: 0.3, - weightkg: 8, + weightkg: 24, color: "Yellow", eggGroups: ["Water 2"], requiredItem: "Tatsugirinite", @@ -20678,15 +20677,30 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = { eggGroups: ["Dragon", "Mineral"], gen: 9, }, + flox: { + num: -76, + name: "Flox", + types: ["Normal", "Electric"], + baseStats: { hp: 96, atk: 25, def: 67, spa: 73, spd: 68, spe: 61 }, + abilities: { 0: "Static", 1: "Sticky Hold", H: "Cud Chew" }, + heightm: 0.9, + weightkg: 66.6, + color: "Brown", + evos: ["Shox"], + eggGroups: ["Field"], + gen: 9, + }, shox: { num: -77, name: "Shox", - types: ["Electric", "Normal"], + types: ["Normal", "Electric"], baseStats: { hp: 136, atk: 55, def: 87, spa: 108, spd: 108, spe: 56 }, abilities: { 0: "Electromorphosis", 1: "Sticky Hold", H: "Cud Chew" }, heightm: 3, weightkg: 99.9, color: "Brown", + prevo: "Flox", + evoLevel: 34, eggGroups: ["Field"], gen: 9, }, 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/gen2/sets.json b/data/random-battles/gen2/sets.json index 8d1d325055..f119307e27 100644 --- a/data/random-battles/gen2/sets.json +++ b/data/random-battles/gen2/sets.json @@ -450,7 +450,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["explosion", "icebeam", "rapidspin", "spikes", "surf", "toxic"] + "movepool": ["explosion", "icebeam", "spikes", "surf"] }, { "role": "Generalist", @@ -1360,11 +1360,7 @@ "sets": [ { "role": "Generalist", - "movepool": ["haze", "hydropump", "rest", "sleeptalk", "sludgebomb", "spikes"] - }, - { - "role": "Bulky Setup", - "movepool": ["curse", "hiddenpowerground", "hydropump", "sludgebomb", "spikes"] + "movepool": ["curse", "haze", "hydropump", "sludgebomb", "spikes"] } ] }, diff --git a/data/random-battles/gen2/teams.ts b/data/random-battles/gen2/teams.ts index 36022fc378..5e90da3e81 100644 --- a/data/random-battles/gen2/teams.ts +++ b/data/random-battles/gen2/teams.ts @@ -473,6 +473,7 @@ export class RandomGen2Teams extends RandomGen3Teams { return { name: species.baseSpecies, species: forme, + speciesId: species.id, level, moves: shuffledMoves, ability: 'No Ability', @@ -485,6 +486,33 @@ export class RandomGen2Teams extends RandomGen3Teams { gender: species.gender ? species.gender : 'M', }; } + + /** + * Checks if the new species is compatible with the other mons currently on the team. + */ + override getPokemonCompatibility( + species: Species, + pokemon: RandomTeamsTypes.RandomSet[], + ): boolean { + const spikesSetters = ['cloyster', 'delibird', 'qwilfish', 'forretress', 'smeargle']; + const incompatibilityList = [ + // These combinations are prevented to avoid double spikes. + [spikesSetters, spikesSetters], + ]; + + for (const pair of incompatibilityList) { + const monsArrayA = (Array.isArray(pair[0])) ? pair[0] : [pair[0]]; + const monsArrayB = (Array.isArray(pair[1])) ? pair[1] : [pair[1]]; + if (monsArrayB.includes(species.id)) { + if (pokemon.some(m => monsArrayA.includes(m.speciesId!))) return false; + } + if (monsArrayA.includes(species.id)) { + if (pokemon.some(m => monsArrayB.includes(m.speciesId!))) return false; + } + } + + return true; + } } export default RandomGen2Teams; diff --git a/data/random-battles/gen3/sets.json b/data/random-battles/gen3/sets.json index 7dd8706e39..fbe3579165 100644 --- a/data/random-battles/gen3/sets.json +++ b/data/random-battles/gen3/sets.json @@ -188,9 +188,14 @@ "level": 82, "sets": [ { - "role": "Wallbreaker", + "role": "Fast Attacker", "movepool": ["earthquake", "fireblast", "icebeam", "shadowball", "sludgebomb", "substitute", "thunderbolt"], "abilities": ["Poison Point"] + }, + { + "role": "Wallbreaker", + "movepool": ["earthquake", "fireblast", "icebeam", "rockslide", "shadowball", "sludgebomb"], + "abilities": ["Poison Point"] } ] }, @@ -198,9 +203,14 @@ "level": 82, "sets": [ { - "role": "Wallbreaker", + "role": "Fast Attacker", "movepool": ["earthquake", "fireblast", "icebeam", "megahorn", "shadowball", "sludgebomb", "substitute", "thunderbolt"], "abilities": ["Poison Point"] + }, + { + "role": "Wallbreaker", + "movepool": ["earthquake", "fireblast", "icebeam", "megahorn", "rockslide", "shadowball", "sludgebomb"], + "abilities": ["Poison Point"] } ] }, @@ -387,7 +397,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 +484,7 @@ }, { "role": "Setup Sweeper", - "movepool": ["calmmind", "psychic", "rest", "surf"], + "movepool": ["calmmind", "psychic", "surf", "thunderwave"], "abilities": ["Own Tempo"] }, { @@ -544,13 +554,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"] } ] @@ -608,6 +618,11 @@ "role": "Setup Sweeper", "movepool": ["doubleedge", "hiddenpowerghost", "hiddenpowerground", "surf", "swordsdance"], "abilities": ["Hyper Cutter"] + }, + { + "role": "Bulky Setup", + "movepool": ["doubleedge", "hiddenpowerghost", "mudshot", "swordsdance"], + "abilities": ["Hyper Cutter"] } ] }, @@ -1063,7 +1078,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"] }, @@ -1222,7 +1237,7 @@ ] }, "crobat": { - "level": 77, + "level": 78, "sets": [ { "role": "Fast Attacker", @@ -1470,7 +1485,7 @@ ] }, "slowking": { - "level": 83, + "level": 82, "sets": [ { "role": "Bulky Support", @@ -1479,7 +1494,7 @@ }, { "role": "Setup Sweeper", - "movepool": ["calmmind", "psychic", "rest", "surf"], + "movepool": ["calmmind", "psychic", "surf", "thunderwave"], "abilities": ["Own Tempo"] }, { @@ -1544,7 +1559,7 @@ }, { "role": "Wallbreaker", - "movepool": ["doubleedge", "earthquake", "protect", "psychic", "return", "shadowball", "thunderbolt", "thunderwave", "toxic", "wish"], + "movepool": ["doubleedge", "earthquake", "protect", "psychic", "return", "thunderwave", "toxic", "wish"], "abilities": ["Early Bird"] } ] @@ -1564,7 +1579,7 @@ "sets": [ { "role": "Bulky Setup", - "movepool": ["bodyslam", "curse", "earthquake", "rest", "shadowball"], + "movepool": ["bodyslam", "curse", "earthquake", "rest", "shadowball", "sleeptalk"], "abilities": ["Serene Grace"] }, { @@ -1585,7 +1600,7 @@ ] }, "steelix": { - "level": 83, + "level": 82, "sets": [ { "role": "Bulky Attacker", @@ -1621,7 +1636,7 @@ ] }, "qwilfish": { - "level": 83, + "level": 82, "sets": [ { "role": "Wallbreaker", @@ -1719,7 +1734,7 @@ ] }, "magcargo": { - "level": 99, + "level": 100, "sets": [ { "role": "Bulky Support", @@ -1770,7 +1785,7 @@ ] }, "delibird": { - "level": 99, + "level": 98, "sets": [ { "role": "Wallbreaker", @@ -2363,7 +2378,7 @@ ] }, "mawile": { - "level": 95, + "level": 96, "sets": [ { "role": "Setup Sweeper", @@ -2482,11 +2497,6 @@ "role": "Bulky Support", "movepool": ["encore", "moonlight", "seismictoss", "thunderwave", "toxic"], "abilities": ["Oblivious"] - }, - { - "role": "Generalist", - "movepool": ["batonpass", "encore", "seismictoss", "substitute", "thunderwave", "toxic"], - "abilities": ["Oblivious"] } ] }, @@ -2557,11 +2567,11 @@ ] }, "torkoal": { - "level": 91, + "level": 90, "sets": [ { "role": "Bulky Attacker", - "movepool": ["explosion", "fireblast", "flamethrower", "hiddenpowergrass", "rest", "toxic"], + "movepool": ["explosion", "fireblast", "flamethrower", "hiddenpowergrass", "toxic"], "abilities": ["White Smoke"] } ] @@ -2571,7 +2581,7 @@ "sets": [ { "role": "Setup Sweeper", - "movepool": ["calmmind", "firepunch", "psychic", "substitute", "thunderpunch"], + "movepool": ["calmmind", "firepunch", "hiddenpowerdark", "psychic", "substitute"], "abilities": ["Thick Fat"], "preferredTypes": ["Fire"] } @@ -2602,11 +2612,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 +3063,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 +3101,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 +3111,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 +3122,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..c260b28708 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'; @@ -624,6 +618,7 @@ export class RandomGen3Teams extends RandomGen4Teams { return { name: species.baseSpecies, species: forme, + speciesId: species.id, gender: species.gender, shiny: this.randomChance(1, 1024), level, @@ -636,6 +631,35 @@ export class RandomGen3Teams extends RandomGen4Teams { }; } + /** + * Checks if the new species is compatible with the other mons currently on the team. + */ + override getPokemonCompatibility( + species: Species, + pokemon: RandomTeamsTypes.RandomSet[], + ): boolean { + const incompatibilityList = [ + // These Pokemon are incompatible because the presence of one actively harms the other. + // Prevent Shedinja + Tyranitar + ['shedinja', 'tyranitar'], + // Prevent Reversal/Flail users + Tyranitar + [['dodrio', 'raticate', 'primeape', 'hitmonlee', 'furret', 'yanma', 'heracross', 'blaziken', 'medicham'], 'tyranitar'], + ]; + + for (const pair of incompatibilityList) { + const monsArrayA = (Array.isArray(pair[0])) ? pair[0] : [pair[0]]; + const monsArrayB = (Array.isArray(pair[1])) ? pair[1] : [pair[1]]; + if (monsArrayB.includes(species.id)) { + if (pokemon.some(m => monsArrayA.includes(m.speciesId!))) return false; + } + if (monsArrayA.includes(species.id)) { + if (pokemon.some(m => monsArrayB.includes(m.speciesId!))) return false; + } + } + + return true; + } + override randomTeam() { this.enforceNoDirectCustomBanlistChanges(); @@ -665,9 +689,6 @@ export class RandomGen3Teams extends RandomGen4Teams { // Limit to one of each species (Species Clause) if (baseFormes[species.baseSpecies]) continue; - // Prevent Shedinja from generating after Tyranitar - if (species.name === 'Shedinja' && teamDetails.sand) continue; - // Limit to one Wobbuffet per battle (not just per team) if (species.name === 'Wobbuffet' && this.battleHasWobbuffet) continue; // Limit to one Ditto per battle in Gen 2 @@ -713,6 +734,9 @@ export class RandomGen3Teams extends RandomGen4Teams { if (!this.adjustLevel && (this.getLevel(species) === 100) && numMaxLevelPokemon >= limitFactor) { continue; } + + // Check compatibility with team + if (!this.getPokemonCompatibility(species, pokemon)) continue; } // Okay, the set passes, add it to our team diff --git a/data/random-battles/gen4/sets.json b/data/random-battles/gen4/sets.json index 672865b259..be4c67dc51 100644 --- a/data/random-battles/gen4/sets.json +++ b/data/random-battles/gen4/sets.json @@ -234,7 +234,7 @@ ] }, "parasect": { - "level": 99, + "level": 100, "sets": [ { "role": "Bulky Support", @@ -340,7 +340,7 @@ ] }, "alakazam": { - "level": 80, + "level": 79, "sets": [ { "role": "Fast Attacker", @@ -388,7 +388,7 @@ ] }, "golem": { - "level": 87, + "level": 86, "sets": [ { "role": "Bulky Attacker", @@ -565,7 +565,7 @@ ] }, "marowak": { - "level": 89, + "level": 88, "sets": [ { "role": "Wallbreaker", @@ -856,7 +856,7 @@ ] }, "snorlax": { - "level": 78, + "level": 77, "sets": [ { "role": "Bulky Attacker", @@ -1158,7 +1158,7 @@ ] }, "sunflora": { - "level": 100, + "level": 99, "sets": [ { "role": "Wallbreaker", @@ -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"] } ] @@ -1427,7 +1427,7 @@ ] }, "mantine": { - "level": 89, + "level": 90, "sets": [ { "role": "Bulky Support", @@ -1512,7 +1512,7 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["earthquake", "hypnosis", "megahorn", "return", "suckerpunch", "thunderbolt"], + "movepool": ["doubleedge", "earthquake", "hypnosis", "megahorn", "return", "suckerpunch", "thunderbolt", "thunderwave"], "abilities": ["Intimidate"], "preferredTypes": ["Ground"] } @@ -1529,7 +1529,7 @@ ] }, "hitmontop": { - "level": 86, + "level": 85, "sets": [ { "role": "Bulky Support", @@ -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"] } ] }, @@ -2314,7 +2319,7 @@ ] }, "cradily": { - "level": 88, + "level": 87, "sets": [ { "role": "Bulky Attacker", @@ -2729,7 +2734,7 @@ ] }, "torterra": { - "level": 86, + "level": 85, "sets": [ { "role": "Bulky Attacker", @@ -2847,7 +2852,7 @@ ] }, "rampardos": { - "level": 87, + "level": 86, "sets": [ { "role": "Setup Sweeper", @@ -2939,7 +2944,7 @@ ] }, "floatzel": { - "level": 83, + "level": 82, "sets": [ { "role": "Fast Attacker", @@ -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"] } ] @@ -3258,7 +3268,7 @@ ] }, "tangrowth": { - "level": 89, + "level": 90, "sets": [ { "role": "Bulky Attacker", @@ -3489,7 +3499,7 @@ ] }, "rotomfrost": { - "level": 79, + "level": 78, "sets": [ { "role": "Bulky Attacker", @@ -3685,7 +3695,7 @@ ] }, "manaphy": { - "level": 75, + "level": 76, "sets": [ { "role": "Bulky Setup", diff --git a/data/random-battles/gen4/teams.ts b/data/random-battles/gen4/teams.ts index 66ebe587c3..beadb292ca 100644 --- a/data/random-battles/gen4/teams.ts +++ b/data/random-battles/gen4/teams.ts @@ -210,7 +210,7 @@ export class RandomGen4Teams extends RandomGen5Teams { for (const pair of incompatiblePairs) this.incompatibleMoves(moves, movePool, pair[0], pair[1]); - const statusInflictingMoves = ['stunspore', 'thunderwave', 'toxic', 'willowisp', 'yawn']; + const statusInflictingMoves = ['hypnosis', 'stunspore', 'thunderwave', 'toxic', 'willowisp', 'yawn']; if (role !== 'Staller') { this.incompatibleMoves(moves, movePool, statusInflictingMoves, statusInflictingMoves); } @@ -766,6 +766,7 @@ export class RandomGen4Teams extends RandomGen5Teams { return { name: species.baseSpecies, species: forme, + speciesId: species.id, gender: species.gender, shiny: this.randomChance(1, 1024), level, @@ -777,6 +778,35 @@ export class RandomGen4Teams extends RandomGen5Teams { role, }; } + + /** + * Checks if the new species is compatible with the other mons currently on the team. + */ + override getPokemonCompatibility( + species: Species, + pokemon: RandomTeamsTypes.RandomSet[], + ): boolean { + const incompatibilityList = [ + // These Pokemon are incompatible because the presence of one actively harms the other. + // Prevent Dry Skin + sun setting ability + [['parasect', 'toxicroak'], 'groudon'], + // Prevent Shedinja + sand/hail setting ability + ['shedinja', ['tyranitar', 'hippowdon', 'abomasnow']], + ]; + + for (const pair of incompatibilityList) { + const monsArrayA = (Array.isArray(pair[0])) ? pair[0] : [pair[0]]; + const monsArrayB = (Array.isArray(pair[1])) ? pair[1] : [pair[1]]; + if (monsArrayB.includes(species.id)) { + if (pokemon.some(m => monsArrayA.includes(m.speciesId!))) return false; + } + if (monsArrayA.includes(species.id)) { + if (pokemon.some(m => monsArrayB.includes(m.speciesId!))) return false; + } + } + + return true; + } } export default RandomGen4Teams; diff --git a/data/random-battles/gen5/sets.json b/data/random-battles/gen5/sets.json index 23a754ef97..0a8f6faf70 100644 --- a/data/random-battles/gen5/sets.json +++ b/data/random-battles/gen5/sets.json @@ -101,7 +101,7 @@ ] }, "fearow": { - "level": 89, + "level": 88, "sets": [ { "role": "Wallbreaker", @@ -393,7 +393,7 @@ ] }, "machamp": { - "level": 82, + "level": 81, "sets": [ { "role": "Bulky Attacker", @@ -458,20 +458,15 @@ "level": 83, "sets": [ { - "role": "Bulky Support", + "role": "Bulky Attacker", "movepool": ["fireblast", "icebeam", "psyshock", "scald", "slackoff", "thunderwave", "toxic"], - "abilities": ["Regenerator"] + "abilities": ["Regenerator"], + "preferredTypes": ["Psychic"] }, { "role": "Staller", "movepool": ["calmmind", "psyshock", "scald", "slackoff"], "abilities": ["Regenerator"] - }, - { - "role": "Wallbreaker", - "movepool": ["fireblast", "icebeam", "psyshock", "surf", "trick", "trickroom"], - "abilities": ["Regenerator"], - "preferredTypes": ["Psychic"] } ] }, @@ -611,7 +606,7 @@ ] }, "hitmonlee": { - "level": 83, + "level": 82, "sets": [ { "role": "Fast Attacker", @@ -804,7 +799,7 @@ ] }, "ditto": { - "level": 87, + "level": 88, "sets": [ { "role": "Fast Support", @@ -955,7 +950,7 @@ ] }, "dragonair": { - "level": 86, + "level": 85, "sets": [ { "role": "Setup Sweeper", @@ -1083,7 +1078,7 @@ ] }, "ariados": { - "level": 98, + "level": 99, "sets": [ { "role": "Bulky Support", @@ -1261,7 +1256,7 @@ ] }, "murkrow": { - "level": 88, + "level": 89, "sets": [ { "role": "Bulky Support", @@ -1274,13 +1269,8 @@ "level": 83, "sets": [ { - "role": "Bulky Support", + "role": "Bulky Attacker", "movepool": ["fireblast", "icebeam", "psyshock", "scald", "slackoff", "thunderwave", "toxic"], - "abilities": ["Regenerator"] - }, - { - "role": "Wallbreaker", - "movepool": ["fireblast", "icebeam", "psyshock", "surf", "trick", "trickroom"], "abilities": ["Regenerator"], "preferredTypes": ["Psychic"] } @@ -1397,7 +1387,7 @@ "sets": [ { "role": "Fast Support", - "movepool": ["destinybond", "spikes", "taunt", "thunderwave", "toxicspikes", "waterfall"], + "movepool": ["destinybond", "poisonjab", "spikes", "taunt", "thunderwave", "toxicspikes", "waterfall"], "abilities": ["Intimidate"] } ] @@ -1579,14 +1569,14 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["doubleedge", "earthquake", "hypnosis", "jumpkick", "megahorn", "suckerpunch", "thunderwave"], + "movepool": ["doubleedge", "earthquake", "hypnosis", "jumpkick", "megahorn", "return", "suckerpunch", "thunderwave"], "abilities": ["Intimidate"], "preferredTypes": ["Ground"] } ] }, "smeargle": { - "level": 88, + "level": 89, "sets": [ { "role": "Fast Support", @@ -1606,7 +1596,7 @@ ] }, "miltank": { - "level": 83, + "level": 82, "sets": [ { "role": "Bulky Attacker", @@ -1961,7 +1951,7 @@ ] }, "shedinja": { - "level": 95, + "level": 96, "sets": [ { "role": "Setup Sweeper", @@ -2173,7 +2163,7 @@ ] }, "camerupt": { - "level": 88, + "level": 89, "sets": [ { "role": "Bulky Support", @@ -2404,7 +2394,7 @@ ] }, "kecleon": { - "level": 95, + "level": 96, "sets": [ { "role": "Bulky Support", @@ -2444,7 +2434,7 @@ ] }, "chimecho": { - "level": 95, + "level": 96, "sets": [ { "role": "Bulky Support", @@ -2930,7 +2920,7 @@ ] }, "wormadamsandy": { - "level": 92, + "level": 91, "sets": [ { "role": "Staller", @@ -3064,9 +3054,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"] } ] @@ -3274,7 +3269,7 @@ { "role": "Fast Attacker", "movepool": ["flashcannon", "hiddenpowerfire", "hiddenpowerground", "hiddenpowerice", "thunderbolt", "voltswitch"], - "abilities": ["Magnet Pull"] + "abilities": ["Analytic", "Magnet Pull"] }, { "role": "Staller", @@ -3314,12 +3309,12 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["earthquake", "hiddenpowerfire", "leafstorm", "leechseed", "morningsun", "powerwhip", "rockslide", "sleeppowder"], + "movepool": ["earthquake", "gigadrain", "hiddenpowerfire", "leafstorm", "leechseed", "morningsun", "rockslide", "sleeppowder"], "abilities": ["Regenerator"] }, { "role": "Bulky Support", - "movepool": ["earthquake", "hiddenpowerfire", "leafstorm", "powerwhip", "rockslide", "sleeppowder"], + "movepool": ["earthquake", "gigadrain", "hiddenpowerfire", "leafstorm", "rockslide", "sleeppowder"], "abilities": ["Regenerator"] } ] @@ -3438,7 +3433,7 @@ ] }, "porygonz": { - "level": 81, + "level": 80, "sets": [ { "role": "Fast Attacker", @@ -3534,7 +3529,7 @@ ] }, "rotomfan": { - "level": 83, + "level": 84, "sets": [ { "role": "Bulky Attacker", @@ -3728,7 +3723,7 @@ ] }, "shaymin": { - "level": 83, + "level": 82, "sets": [ { "role": "Fast Support", @@ -4012,17 +4007,22 @@ ] }, "samurott": { - "level": 86, + "level": 87, "sets": [ { - "role": "Fast Attacker", + "role": "Wallbreaker", "movepool": ["aquajet", "grassknot", "hydropump", "icebeam", "megahorn", "superpower"], "abilities": ["Torrent"] }, { - "role": "Wallbreaker", + "role": "Setup Sweeper", "movepool": ["aquajet", "megahorn", "superpower", "swordsdance", "waterfall"], "abilities": ["Torrent"] + }, + { + "role": "Fast Attacker", + "movepool": ["grassknot", "hydropump", "icebeam", "scald"], + "abilities": ["Torrent"] } ] }, @@ -4129,7 +4129,7 @@ ] }, "zebstrika": { - "level": 86, + "level": 85, "sets": [ { "role": "Fast Attacker", @@ -4387,7 +4387,7 @@ ] }, "cofagrigus": { - "level": 87, + "level": 86, "sets": [ { "role": "Bulky Support", @@ -4412,7 +4412,7 @@ ] }, "archeops": { - "level": 78, + "level": 77, "sets": [ { "role": "Fast Attacker", @@ -4463,7 +4463,7 @@ ] }, "reuniclus": { - "level": 83, + "level": 84, "sets": [ { "role": "Bulky Setup", @@ -4473,7 +4473,7 @@ ] }, "swanna": { - "level": 86, + "level": 85, "sets": [ { "role": "Bulky Attacker", @@ -4499,7 +4499,7 @@ ] }, "sawsbuck": { - "level": 85, + "level": 84, "sets": [ { "role": "Setup Sweeper", @@ -4574,7 +4574,7 @@ }, { "role": "Wallbreaker", - "movepool": ["bugbuzz", "energyball", "thunder", "voltswitch"], + "movepool": ["bugbuzz", "gigadrain", "thunder", "voltswitch"], "abilities": ["Compound Eyes"] } ] @@ -4647,7 +4647,7 @@ ] }, "haxorus": { - "level": 74, + "level": 75, "sets": [ { "role": "Setup Sweeper", @@ -4657,7 +4657,7 @@ ] }, "beartic": { - "level": 92, + "level": 93, "sets": [ { "role": "Wallbreaker", @@ -4875,7 +4875,7 @@ ] }, "tornadus": { - "level": 79, + "level": 78, "sets": [ { "role": "Bulky Setup", @@ -4915,7 +4915,7 @@ ] }, "thundurustherian": { - "level": 77, + "level": 76, "sets": [ { "role": "Fast Attacker", diff --git a/data/random-battles/gen5/teams.ts b/data/random-battles/gen5/teams.ts index 0774d4a494..21af10e2ef 100644 --- a/data/random-battles/gen5/teams.ts +++ b/data/random-battles/gen5/teams.ts @@ -830,6 +830,7 @@ export class RandomGen5Teams extends RandomGen6Teams { return { name: species.baseSpecies, species: forme, + speciesId: species.id, gender: species.gender, shiny: this.randomChance(1, 1024), level, @@ -842,6 +843,39 @@ export class RandomGen5Teams extends RandomGen6Teams { }; } + /** + * Checks if the new species is compatible with the other mons currently on the team. + */ + override getPokemonCompatibility( + species: Species, + pokemon: RandomTeamsTypes.RandomSet[], + ): boolean { + const incompatibilityList = [ + // These Pokemon with support roles are considered too similar to each other. + ['blissey', 'chansey'], + ['illumise', 'volbeat'], + + // These Pokemon are incompatible because the presence of one actively harms the other. + // Prevent Dry Skin + sun setting ability + [['parasect', 'jynx', 'toxicroak'], ['ninetales', 'groudon']], + // Prevent Shedinja + sand/hail setting ability + ['shedinja', ['tyranitar', 'hippowdon', 'abomasnow']], + ]; + + for (const pair of incompatibilityList) { + const monsArrayA = (Array.isArray(pair[0])) ? pair[0] : [pair[0]]; + const monsArrayB = (Array.isArray(pair[1])) ? pair[1] : [pair[1]]; + if (monsArrayB.includes(species.id)) { + if (pokemon.some(m => monsArrayA.includes(m.speciesId!))) return false; + } + if (monsArrayA.includes(species.id)) { + if (pokemon.some(m => monsArrayB.includes(m.speciesId!))) return false; + } + } + + return true; + } + override randomTeam() { this.enforceNoDirectCustomBanlistChanges(); @@ -874,9 +908,6 @@ export class RandomGen5Teams extends RandomGen6Teams { // Illusion shouldn't be in the last slot if (species.name === 'Zoroark' && pokemon.length >= (this.maxTeamSize - 1)) continue; - // Prevent Shedinja from generating after Sandstorm/Hail setters - if (species.name === 'Shedinja' && (teamDetails.sand || teamDetails.hail)) continue; - // Dynamically scale limits for different team sizes. The default and minimum value is 1. const limitFactor = Math.round(this.maxTeamSize / 6) || 1; @@ -924,6 +955,9 @@ export class RandomGen5Teams extends RandomGen6Teams { if (!this.adjustLevel && (this.getLevel(species) === 100) && numMaxLevelPokemon >= limitFactor) { continue; } + + // Check compatibility with team + if (!this.getPokemonCompatibility(species, pokemon)) continue; } const set = this.randomSet(species, teamDetails, pokemon.length === 0); diff --git a/data/random-battles/gen5pokebilities/teams.ts b/data/random-battles/gen5pokebilities/teams.ts deleted file mode 100644 index f69104146d..0000000000 --- a/data/random-battles/gen5pokebilities/teams.ts +++ /dev/null @@ -1,5 +0,0 @@ -import RandomGen5Teams from '../gen5/teams'; - -export class RandomGen5PokebilitiesTeams extends RandomGen5Teams {} - -export default RandomGen5PokebilitiesTeams; diff --git a/data/random-battles/gen6/sets.json b/data/random-battles/gen6/sets.json index 479d44bed4..14380db5a2 100644 --- a/data/random-battles/gen6/sets.json +++ b/data/random-battles/gen6/sets.json @@ -25,12 +25,17 @@ ] }, "charizard": { - "level": 83, + "level": 84, "sets": [ { "role": "Bulky Attacker", "movepool": ["airslash", "earthquake", "fireblast", "roost", "willowisp"], "abilities": ["Blaze", "Solar Power"] + }, + { + "role": "Setup Sweeper", + "movepool": ["acrobatics", "earthquake", "flareblitz", "swordsdance"], + "abilities": ["Blaze"] } ] }, @@ -219,7 +224,7 @@ ] }, "nidoking": { - "level": 82, + "level": 81, "sets": [ { "role": "Wallbreaker", @@ -292,7 +297,7 @@ ] }, "venomoth": { - "level": 84, + "level": 83, "sets": [ { "role": "Bulky Setup", @@ -496,14 +501,10 @@ "level": 82, "sets": [ { - "role": "Bulky Support", - "movepool": ["fireblast", "icebeam", "psyshock", "scald", "slackoff", "thunderwave", "toxic"], - "abilities": ["Regenerator"] - }, - { - "role": "AV Pivot", - "movepool": ["fireblast", "futuresight", "icebeam", "psyshock", "scald"], - "abilities": ["Regenerator"] + "role": "Bulky Attacker", + "movepool": ["calmmind", "fireblast", "icebeam", "psyshock", "scald", "slackoff", "thunderwave", "toxic"], + "abilities": ["Regenerator"], + "preferredTypes": ["Psychic"] } ] }, @@ -629,7 +630,7 @@ ] }, "electrode": { - "level": 88, + "level": 87, "sets": [ { "role": "Wallbreaker", @@ -791,9 +792,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"] } ] }, @@ -828,7 +834,7 @@ ] }, "pinsir": { - "level": 85, + "level": 84, "sets": [ { "role": "Fast Attacker", @@ -1372,14 +1378,10 @@ "level": 86, "sets": [ { - "role": "Bulky Support", - "movepool": ["fireblast", "icebeam", "nastyplot", "psyshock", "scald", "slackoff", "thunderwave", "toxic"], - "abilities": ["Regenerator"] - }, - { - "role": "AV Pivot", - "movepool": ["dragontail", "fireblast", "futuresight", "icebeam", "psyshock", "scald"], - "abilities": ["Regenerator"] + "role": "Bulky Attacker", + "movepool": ["dragontail", "fireblast", "icebeam", "nastyplot", "psyshock", "scald", "slackoff", "thunderwave", "toxic"], + "abilities": ["Regenerator"], + "preferredTypes": ["Psychic"] } ] }, @@ -1500,7 +1502,7 @@ "sets": [ { "role": "Fast Support", - "movepool": ["destinybond", "spikes", "taunt", "thunderwave", "toxicspikes", "waterfall"], + "movepool": ["destinybond", "poisonjab", "spikes", "taunt", "thunderwave", "toxicspikes", "waterfall"], "abilities": ["Intimidate"] } ] @@ -1617,12 +1619,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"] } ] }, @@ -1726,7 +1730,7 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["doubleedge", "earthquake", "jumpkick", "megahorn", "suckerpunch", "thunderwave"], + "movepool": ["doubleedge", "earthquake", "jumpkick", "megahorn", "return", "suckerpunch", "thunderwave"], "abilities": ["Intimidate"], "preferredTypes": ["Ground"] } @@ -2263,8 +2267,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"] } @@ -2521,7 +2530,7 @@ ] }, "altariamega": { - "level": 78, + "level": 77, "sets": [ { "role": "Setup Sweeper", @@ -2890,7 +2899,7 @@ ] }, "regirock": { - "level": 86, + "level": 85, "sets": [ { "role": "Bulky Setup", @@ -3011,7 +3020,7 @@ ] }, "groudon": { - "level": 74, + "level": 73, "sets": [ { "role": "Bulky Support", @@ -3112,17 +3121,12 @@ ] }, "deoxysdefense": { - "level": 84, + "level": 83, "sets": [ { "role": "Bulky Support", "movepool": ["knockoff", "recover", "seismictoss", "spikes", "stealthrock", "taunt", "toxic"], "abilities": ["Pressure"] - }, - { - "role": "Bulky Setup", - "movepool": ["focusblast", "nastyplot", "psychic", "psyshock", "recover", "signalbeam"], - "abilities": ["Pressure"] } ] }, @@ -3273,12 +3277,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"] } ] @@ -3324,7 +3323,7 @@ ] }, "mothim": { - "level": 94, + "level": 95, "sets": [ { "role": "Setup Sweeper", @@ -3396,7 +3395,7 @@ ] }, "ambipom": { - "level": 83, + "level": 82, "sets": [ { "role": "Fast Attacker", @@ -3520,7 +3519,7 @@ ] }, "spiritomb": { - "level": 88, + "level": 87, "sets": [ { "role": "Bulky Setup", @@ -3550,7 +3549,7 @@ ] }, "garchompmega": { - "level": 76, + "level": 75, "sets": [ { "role": "Bulky Support", @@ -3689,7 +3688,7 @@ { "role": "Fast Attacker", "movepool": ["flashcannon", "hiddenpowerground", "thunderbolt", "voltswitch"], - "abilities": ["Magnet Pull"] + "abilities": ["Analytic", "Magnet Pull"] }, { "role": "Staller", @@ -3736,16 +3735,16 @@ ] }, "tangrowth": { - "level": 88, + "level": 87, "sets": [ { "role": "Bulky Attacker", - "movepool": ["earthquake", "knockoff", "leafstorm", "leechseed", "morningsun", "powerwhip", "rockslide", "sleeppowder", "sludgebomb"], + "movepool": ["earthquake", "gigadrain", "knockoff", "leafstorm", "leechseed", "morningsun", "rockslide", "sleeppowder", "sludgebomb"], "abilities": ["Regenerator"] }, { "role": "AV Pivot", - "movepool": ["earthquake", "gigadrain", "knockoff", "powerwhip", "rockslide", "sludgebomb"], + "movepool": ["earthquake", "gigadrain", "knockoff", "leafstorm", "rockslide", "sludgebomb"], "abilities": ["Regenerator"] } ] @@ -3793,7 +3792,7 @@ ] }, "yanmega": { - "level": 82, + "level": 81, "sets": [ { "role": "Fast Attacker", @@ -3996,7 +3995,7 @@ "level": 86, "sets": [ { - "role": "Fast Support", + "role": "Bulky Attacker", "movepool": ["hiddenpowerice", "leafstorm", "thunderbolt", "trick", "voltswitch", "willowisp"], "abilities": ["Levitate"] } @@ -4131,7 +4130,7 @@ ] }, "cresselia": { - "level": 80, + "level": 79, "sets": [ { "role": "Bulky Setup", @@ -4156,7 +4155,7 @@ ] }, "manaphy": { - "level": 76, + "level": 77, "sets": [ { "role": "Bulky Setup", @@ -4482,9 +4481,14 @@ "abilities": ["Torrent"] }, { - "role": "Fast Attacker", + "role": "Setup Sweeper", "movepool": ["aquajet", "knockoff", "megahorn", "superpower", "swordsdance", "waterfall"], "abilities": ["Torrent"] + }, + { + "role": "Fast Attacker", + "movepool": ["grassknot", "hydropump", "icebeam", "scald"], + "abilities": ["Torrent"] } ] }, @@ -4637,7 +4641,7 @@ ] }, "audino": { - "level": 90, + "level": 91, "sets": [ { "role": "Bulky Support", @@ -5123,7 +5127,7 @@ ] }, "haxorus": { - "level": 77, + "level": 76, "sets": [ { "role": "Setup Sweeper", @@ -5614,7 +5618,7 @@ ] }, "talonflame": { - "level": 79, + "level": 78, "sets": [ { "role": "Bulky Attacker", @@ -5893,11 +5897,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..9730d0dbd8 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]); @@ -258,7 +260,7 @@ export class RandomGen6Teams extends RandomGen7Teams { this.incompatibleMoves(moves, movePool, 'knockoff', ['pursuit', 'suckerpunch']); } - const statusInflictingMoves = ['thunderwave', 'toxic', 'willowisp', 'yawn']; + const statusInflictingMoves = ["nuzzle", 'thunderwave', 'toxic', 'willowisp', 'yawn']; if (!abilities.includes('Prankster') && role !== 'Staller') { this.incompatibleMoves(moves, movePool, statusInflictingMoves, statusInflictingMoves); } @@ -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')) && @@ -887,6 +883,7 @@ export class RandomGen6Teams extends RandomGen7Teams { return { name: species.baseSpecies, species: forme, + speciesId: species.id, gender: species.gender || (this.random(2) ? 'F' : 'M'), shiny: this.randomChance(1, 1024), level, diff --git a/data/random-battles/gen7/sets.json b/data/random-battles/gen7/sets.json index df1a2c853e..87969a681d 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"], @@ -450,7 +455,7 @@ ] }, "golduck": { - "level": 93, + "level": 92, "sets": [ { "role": "Bulky Setup", @@ -462,7 +467,7 @@ "role": "Fast Attacker", "movepool": ["calmmind", "encore", "focusblast", "hydropump", "icebeam"], "abilities": ["Cloud Nine", "Swift Swim"], - "preferredTypes": ["Ice"] + "preferredTypes": ["Ice"] } ] }, @@ -530,7 +535,7 @@ ] }, "alakazammega": { - "level": 78, + "level": 77, "sets": [ { "role": "Setup Sweeper", @@ -637,14 +642,10 @@ "level": 85, "sets": [ { - "role": "Bulky Support", - "movepool": ["fireblast", "icebeam", "psyshock", "scald", "slackoff", "thunderwave", "toxic"], - "abilities": ["Regenerator"] - }, - { - "role": "AV Pivot", - "movepool": ["fireblast", "futuresight", "icebeam", "psyshock", "scald"], - "abilities": ["Regenerator"] + "role": "Bulky Attacker", + "movepool": ["calmmind", "fireblast", "icebeam", "psyshock", "scald", "slackoff", "thunderwave", "toxic"], + "abilities": ["Regenerator"], + "preferredTypes": ["Psychic"] } ] }, @@ -777,7 +778,7 @@ ] }, "kingler": { - "level": 87, + "level": 88, "sets": [ { "role": "Setup Sweeper", @@ -830,7 +831,7 @@ ] }, "marowak": { - "level": 88, + "level": 89, "sets": [ { "role": "Wallbreaker", @@ -975,9 +976,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"] } ] }, @@ -1012,7 +1018,7 @@ ] }, "pinsir": { - "level": 84, + "level": 85, "sets": [ { "role": "Fast Attacker", @@ -1023,7 +1029,7 @@ ] }, "pinsirmega": { - "level": 74, + "level": 73, "sets": [ { "role": "Bulky Setup", @@ -1171,7 +1177,7 @@ ] }, "aerodactyl": { - "level": 82, + "level": 81, "sets": [ { "role": "Bulky Attacker", @@ -1584,14 +1590,10 @@ "level": 89, "sets": [ { - "role": "Bulky Support", - "movepool": ["fireblast", "icebeam", "nastyplot", "psyshock", "scald", "slackoff", "thunderwave", "toxic"], - "abilities": ["Regenerator"] - }, - { - "role": "AV Pivot", - "movepool": ["dragontail", "fireblast", "futuresight", "icebeam", "psyshock", "scald"], - "abilities": ["Regenerator"] + "role": "Bulky Attacker", + "movepool": ["dragontail", "fireblast", "icebeam", "nastyplot", "psyshock", "scald", "slackoff", "thunderwave", "toxic"], + "abilities": ["Regenerator"], + "preferredTypes": ["Psychic"] } ] }, @@ -1606,7 +1608,7 @@ ] }, "wobbuffet": { - "level": 94, + "level": 95, "sets": [ { "role": "Bulky Support", @@ -1716,7 +1718,7 @@ "sets": [ { "role": "Fast Support", - "movepool": ["destinybond", "spikes", "taunt", "thunderwave", "toxicspikes", "waterfall"], + "movepool": ["destinybond", "poisonjab", "spikes", "taunt", "thunderwave", "toxicspikes", "waterfall"], "abilities": ["Intimidate"] } ] @@ -1770,10 +1772,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"], @@ -1943,7 +1950,7 @@ "sets": [ { "role": "Wallbreaker", - "movepool": ["doubleedge", "earthquake", "jumpkick", "megahorn", "suckerpunch", "throatchop", "thunderwave"], + "movepool": ["doubleedge", "earthquake", "jumpkick", "megahorn", "return", "suckerpunch", "throatchop", "thunderwave"], "abilities": ["Intimidate"], "preferredTypes": ["Ground"] } @@ -2209,7 +2216,7 @@ ] }, "beautifly": { - "level": 99, + "level": 98, "sets": [ { "role": "Setup Sweeper", @@ -2403,7 +2410,7 @@ ] }, "shedinja": { - "level": 96, + "level": 97, "sets": [ { "role": "Setup Sweeper", @@ -2470,7 +2477,7 @@ ] }, "mawile": { - "level": 89, + "level": 90, "sets": [ { "role": "Bulky Attacker", @@ -2493,15 +2500,20 @@ "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"] } ] }, "aggronmega": { - "level": 81, + "level": 80, "sets": [ { "role": "Bulky Attacker", @@ -2609,7 +2621,7 @@ ] }, "swalot": { - "level": 90, + "level": 91, "sets": [ { "role": "Bulky Attacker", @@ -2655,7 +2667,7 @@ ] }, "camerupt": { - "level": 90, + "level": 91, "sets": [ { "role": "Setup Sweeper", @@ -2989,7 +3001,7 @@ ] }, "absolmega": { - "level": 82, + "level": 81, "sets": [ { "role": "Setup Sweeper", @@ -3400,11 +3412,6 @@ "role": "Bulky Support", "movepool": ["knockoff", "recover", "seismictoss", "spikes", "stealthrock", "taunt", "toxic"], "abilities": ["Pressure"] - }, - { - "role": "Bulky Setup", - "movepool": ["focusblast", "nastyplot", "psychic", "psyshock", "recover", "signalbeam"], - "abilities": ["Pressure"] } ] }, @@ -3447,12 +3454,6 @@ "movepool": ["closecombat", "grassknot", "machpunch", "overheat", "stealthrock"], "abilities": ["Blaze", "Iron Fist"] }, - { - "role": "Z-Move user", - "movepool": ["fireblast", "focusblast", "grassknot", "nastyplot", "vacuumwave"], - "abilities": ["Blaze"], - "preferredTypes": ["Fighting"] - }, { "role": "Fast Support", "movepool": ["closecombat", "flareblitz", "machpunch", "stoneedge", "swordsdance", "uturn"], @@ -3553,16 +3554,11 @@ ] }, "bastiodon": { - "level": 94, + "level": 93, "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 +3999,7 @@ { "role": "Fast Attacker", "movepool": ["flashcannon", "hiddenpowerground", "thunderbolt", "voltswitch"], - "abilities": ["Magnet Pull"] + "abilities": ["Analytic", "Magnet Pull"] }, { "role": "Staller", @@ -4054,12 +4050,12 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["earthquake", "knockoff", "leafstorm", "leechseed", "morningsun", "powerwhip", "rockslide", "sleeppowder", "sludgebomb"], + "movepool": ["earthquake", "gigadrain", "knockoff", "leafstorm", "leechseed", "morningsun", "rockslide", "sleeppowder", "sludgebomb"], "abilities": ["Regenerator"] }, { "role": "AV Pivot", - "movepool": ["earthquake", "gigadrain", "knockoff", "powerwhip", "rockslide", "sludgebomb"], + "movepool": ["earthquake", "gigadrain", "knockoff", "leafstorm", "rockslide", "sludgebomb"], "abilities": ["Regenerator"] } ] @@ -4299,7 +4295,7 @@ ] }, "rotomfrost": { - "level": 86, + "level": 85, "sets": [ { "role": "Bulky Attacker", @@ -4328,7 +4324,7 @@ "level": 86, "sets": [ { - "role": "Fast Support", + "role": "Bulky Attacker", "movepool": ["defog", "hiddenpowerice", "leafstorm", "thunderbolt", "trick", "voltswitch", "willowisp"], "abilities": ["Levitate"] } @@ -4849,9 +4845,14 @@ "abilities": ["Torrent"] }, { - "role": "Fast Attacker", + "role": "Setup Sweeper", "movepool": ["aquajet", "knockoff", "liquidation", "megahorn", "sacredsword", "swordsdance"], "abilities": ["Torrent"] + }, + { + "role": "Fast Attacker", + "movepool": ["grassknot", "hydropump", "icebeam", "scald"], + "abilities": ["Torrent"] } ] }, @@ -5082,6 +5083,11 @@ "movepool": ["bulkup", "facade", "knockoff", "stormthrow"], "abilities": ["Guts"] }, + { + "role": "Wallbreaker", + "movepool": ["facade", "knockoff", "stormthrow", "superpower"], + "abilities": ["Guts"] + }, { "role": "Bulky Support", "movepool": ["bulkup", "circlethrow", "knockoff", "rest", "sleeptalk"], @@ -5629,7 +5635,7 @@ ] }, "bisharp": { - "level": 82, + "level": 81, "sets": [ { "role": "Fast Attacker", @@ -5852,7 +5858,7 @@ ] }, "zekrom": { - "level": 74, + "level": 75, "sets": [ { "role": "Setup Sweeper", @@ -5912,7 +5918,7 @@ ] }, "kyurem": { - "level": 80, + "level": 79, "sets": [ { "role": "Staller", @@ -6180,7 +6186,7 @@ ] }, "furfrou": { - "level": 86, + "level": 87, "sets": [ { "role": "Bulky Support", @@ -6333,7 +6339,7 @@ ] }, "tyrantrum": { - "level": 81, + "level": 80, "sets": [ { "role": "Fast Attacker", @@ -6363,11 +6369,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"], @@ -6665,6 +6666,11 @@ "role": "Bulky Attacker", "movepool": ["hydropump", "moonblast", "psychic", "scald"], "abilities": ["Torrent"] + }, + { + "role": "Bulky Support", + "movepool": ["moonblast", "rest", "scald", "sleeptalk"], + "abilities": ["Torrent"] } ] }, @@ -6735,7 +6741,7 @@ ] }, "oricoriopompom": { - "level": 87, + "level": 86, "sets": [ { "role": "Bulky Attacker", @@ -6833,7 +6839,7 @@ "sets": [ { "role": "AV Pivot", - "movepool": ["earthquake", "hiddenpowergrass", "hydropump", "icebeam", "scald", "uturn"], + "movepool": ["earthquake", "hydropump", "icebeam", "scald", "uturn"], "abilities": ["Schooling"], "preferredTypes": ["Ice"] }, @@ -6959,7 +6965,7 @@ ] }, "comfey": { - "level": 87, + "level": 88, "sets": [ { "role": "Bulky Support", @@ -7420,7 +7426,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"] } ] @@ -7432,6 +7443,11 @@ "role": "Bulky Setup", "movepool": ["calmmind", "hydropump", "icebeam", "moonblast", "surf", "taunt"], "abilities": ["Misty Surge"] + }, + { + "role": "Bulky Support", + "movepool": ["defog", "hydropump", "knockoff", "moonblast", "naturesmadness", "surf", "taunt"], + "abilities": ["Misty Surge"] } ] }, @@ -7468,7 +7484,7 @@ }, { "role": "Z-Move user", - "movepool": ["calmmind", "moonblast", "moongeistbeam", "psyshock", "roost"], + "movepool": ["calmmind", "moongeistbeam", "psyshock", "roost"], "abilities": ["Shadow Shield"] } ] @@ -7477,7 +7493,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..e971a977d8 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), @@ -199,7 +199,7 @@ export class RandomGen7Teams extends RandomGen8Teams { if (move.priority > 0) counter.add('priority'); } // Moves with secondary effects: - if (move.secondary || move.hasSheerForce) { + if (move.secondary || move.hasSheerForceBoost) { counter.add('sheerforce'); if (sereneGraceBenefits(move)) { counter.add('serenegrace'); @@ -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]); @@ -375,7 +377,7 @@ export class RandomGen7Teams extends RandomGen8Teams { this.incompatibleMoves(moves, movePool, 'knockoff', ['pursuit', 'suckerpunch']); } - const statusInflictingMoves = ['thunderwave', 'toxic', 'willowisp', 'yawn']; + const statusInflictingMoves = ["nuzzle", 'thunderwave', 'toxic', 'willowisp', 'yawn']; if (!abilities.includes('Prankster') && role !== 'Staller') { this.incompatibleMoves(moves, movePool, statusInflictingMoves, statusInflictingMoves); } @@ -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')) && @@ -1176,6 +1172,7 @@ export class RandomGen7Teams extends RandomGen8Teams { return { name: species.baseSpecies, species: forme, + speciesId: species.id, gender: species.baseSpecies === 'Greninja' ? 'M' : (species.gender || (this.random(2) ? 'F' : 'M')), shiny: this.randomChance(1, 1024), level, @@ -1188,6 +1185,60 @@ export class RandomGen7Teams extends RandomGen8Teams { }; } + /** + * Checks if the new species is compatible with the other mons currently on the team. + */ + getPokemonCompatibility( + species: Species, + pokemon: RandomTeamsTypes.RandomSet[], + ): boolean { + const webSetters = [ + 'ariados', 'shuckle', 'smeargle', 'masquerain', 'kricketune', 'leavanny', 'galvantula', 'ribombee', 'araquanid', + ]; + + // Some pokes are setters in gen 7 but not gen 6 + const gen6ScreenSetters = ['meowstic', 'carbink']; + const screenSetters = (this.gen === 7) ? [...gen6ScreenSetters, 'electrode', 'ninetalesalola'] : gen6ScreenSetters; + + const gen6SunSetters = ['charizardmegay', 'ninetales', 'groudon']; + const sunSetters = (this.gen === 7) ? [...gen6SunSetters, 'torkoal'] : gen6SunSetters; + + const gen6SandSetters = ['tyranitar', 'tyranitarmega', 'hippowdon']; + const sandSetters = (this.gen === 7) ? [...gen6SandSetters, 'gigalith'] : gen6SandSetters; + + const gen6HailSetters = ['abomasnow', 'abomasnowmega', 'aurorus']; + const hailSetters = (this.gen === 7) ? [...gen6HailSetters, 'vanilluxe', 'ninetalesalola'] : gen6HailSetters; + + const incompatibilityList = [ + // These Pokemon with support roles are considered too similar to each other. + ['blissey', 'chansey'], + ['illumise', 'volbeat'], + + // These combinations are prevented to avoid double webs or screens. + [webSetters, webSetters], + [screenSetters, screenSetters], + + // These Pokemon are incompatible because the presence of one actively harms the other. + // Prevent Dry Skin + sun setting ability + ['parasect', 'jynx', 'toxicroak', 'heliolisk', sunSetters], + // Prevent Shedinja + sand/hail setting ability + ['shedinja', [...sandSetters, ...hailSetters]], + ]; + + for (const pair of incompatibilityList) { + const monsArrayA = (Array.isArray(pair[0])) ? pair[0] : [pair[0]]; + const monsArrayB = (Array.isArray(pair[1])) ? pair[1] : [pair[1]]; + if (monsArrayB.includes(species.id)) { + if (pokemon.some(m => monsArrayA.includes(m.speciesId!))) return false; + } + if (monsArrayA.includes(species.id)) { + if (pokemon.some(m => monsArrayB.includes(m.speciesId!))) return false; + } + } + + return true; + } + override randomTeam() { this.enforceNoDirectCustomBanlistChanges(); @@ -1304,6 +1355,9 @@ export class RandomGen7Teams extends RandomGen8Teams { if (!this.adjustLevel && (this.getLevel(species) === 100) && numMaxLevelPokemon >= limitFactor) { continue; } + + // Check compatibility with team + if (!this.getPokemonCompatibility(species, pokemon)) continue; } // Limit three of any type combination in Monotype @@ -1607,8 +1661,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..a62160318b 100644 --- a/data/random-battles/gen8/data.json +++ b/data/random-battles/gen8/data.json @@ -269,7 +269,7 @@ "doublesMoves": ["closecombat", "fakeout", "knockoff", "poisonjab", "protect", "rockslide"] }, "hitmonchan": { - "level": 88, + "level": 87, "moves": ["bulkup", "drainpunch", "icepunch", "machpunch", "rapidspin", "throatchop"], "doublesLevel": 88, "doublesMoves": ["coaching", "drainpunch", "feint", "firepunch", "icepunch", "machpunch"] @@ -319,7 +319,7 @@ "doublesMoves": ["dazzlinggleam", "fakeout", "icywind", "lightscreen", "psychic", "reflect"] }, "mrmimegalar": { - "level": 84, + "level": 83, "moves": ["focusblast", "freezedry", "nastyplot", "psychic", "rapidspin"] }, "scyther": { @@ -353,7 +353,7 @@ "doublesMoves": ["bounce", "dragondance", "icefang", "powerwhip", "protect", "waterfall"] }, "laprasgmax": { - "level": 85, + "level": 84, "moves": ["freezedry", "icebeam", "protect", "sparklingaria", "thunderbolt", "toxic"], "doublesLevel": 84, "doublesMoves": ["freezedry", "helpinghand", "hydropump", "icywind", "protect", "thunderbolt"] @@ -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"] @@ -430,13 +430,13 @@ "doublesMoves": ["heatwave", "hurricane", "roost", "tailwind", "thunderbolt", "voltswitch"] }, "zapdosgalar": { - "level": 74, + "level": 73, "moves": ["bravebird", "bulkup", "closecombat", "throatchop", "uturn"], "doublesLevel": 76, "doublesMoves": ["bravebird", "bulkup", "closecombat", "throatchop", "thunderouskick", "uturn"] }, "moltres": { - "level": 79, + "level": 78, "moves": ["airslash", "defog", "fireblast", "roost", "uturn"], "doublesLevel": 81, "doublesMoves": ["bravebird", "fireblast", "heatwave", "protect", "roost", "tailwind"], @@ -457,8 +457,8 @@ "noDynamaxMoves": ["dragondance", "dualwingbeat", "earthquake", "outrage", "roost"] }, "mewtwo": { - "level": 71, - "moves": ["fireblast", "nastyplot", "psystrike", "recover", "shadowball"], + "level": 72, + "moves": ["aurasphere", "fireblast", "nastyplot", "psystrike", "recover"], "doublesLevel": 74, "doublesMoves": ["aurasphere", "icebeam", "nastyplot", "psystrike", "recover"] }, @@ -531,7 +531,7 @@ "doublesMoves": ["calmmind", "dazzlinggleam", "morningsun", "protect", "psychic", "shadowball"] }, "umbreon": { - "level": 82, + "level": 81, "moves": ["foulplay", "protect", "toxic", "wish"], "doublesLevel": 88, "doublesMoves": ["foulplay", "helpinghand", "moonlight", "protect", "snarl", "toxic"] @@ -556,7 +556,7 @@ "noDynamaxMoves": ["counter", "destinybond", "encore", "mirrorcoat"] }, "dunsparce": { - "level": 90, + "level": 91, "moves": ["bodyslam", "coil", "earthquake", "roost"], "doublesLevel": 90, "doublesMoves": ["glare", "headbutt", "protect", "rockslide"] @@ -647,7 +647,7 @@ "doublesMoves": ["closecombat", "coaching", "fakeout", "helpinghand", "rapidspin", "suckerpunch", "tripleaxel"] }, "miltank": { - "level": 83, + "level": 82, "moves": ["bodyslam", "earthquake", "healbell", "milkdrink", "stealthrock", "toxic"], "doublesLevel": 86, "doublesMoves": ["bodypress", "bodyslam", "helpinghand", "icywind", "milkdrink", "protect", "rockslide"] @@ -659,7 +659,7 @@ "doublesMoves": ["allyswitch", "healpulse", "helpinghand", "protect", "seismictoss", "softboiled", "thunderwave", "toxic"] }, "raikou": { - "level": 79, + "level": 80, "moves": ["aurasphere", "calmmind", "scald", "substitute", "thunderbolt", "voltswitch"], "doublesLevel": 82, "doublesMoves": ["aurasphere", "calmmind", "protect", "scald", "snarl", "thunderbolt", "voltswitch"] @@ -739,7 +739,7 @@ "noDynamaxMoves": ["defog", "knockoff", "leafblade", "lowkick", "rockslide", "suckerpunch", "swordsdance"] }, "pelipper": { - "level": 87, + "level": 86, "moves": ["defog", "hurricane", "hydropump", "roost", "scald", "uturn"], "doublesLevel": 83, "doublesMoves": ["hurricane", "hydropump", "protect", "roost", "tailwind", "wideguard"] @@ -879,7 +879,7 @@ "doublesMoves": ["closecombat", "knockoff", "protect", "suckerpunch", "swordsdance"] }, "glalie": { - "level": 96, + "level": 95, "moves": ["earthquake", "freezedry", "spikes", "superfang", "taunt"], "doublesLevel": 94, "doublesMoves": ["disable", "foulplay", "freezedry", "helpinghand", "icywind", "protect"] @@ -971,7 +971,7 @@ "doublesMoves": ["playrough", "protect", "superpower", "voltswitch", "wildcharge"] }, "roserade": { - "level": 84, + "level": 83, "moves": ["leafstorm", "sleeppowder", "sludgebomb", "spikes", "synthesis", "toxicspikes"], "doublesLevel": 86, "doublesMoves": ["energyball", "leafstorm", "protect", "sleeppowder", "sludgebomb"] @@ -1005,7 +1005,7 @@ "doublesMoves": ["calmmind", "icywind", "shadowball", "strengthsap"] }, "lopunny": { - "level": 95, + "level": 96, "moves": ["closecombat", "facade", "healingwish", "switcheroo"], "doublesLevel": 92, "doublesMoves": ["closecombat", "fakeout", "switcheroo", "uturn"] @@ -1077,13 +1077,13 @@ "doublesMoves": ["bodypress", "electroweb", "flashcannon", "protect", "thunderbolt", "voltswitch"] }, "lickilicky": { - "level": 86, + "level": 87, "moves": ["bodyslam", "earthquake", "explosion", "healbell", "knockoff", "protect", "swordsdance", "wish"], "doublesLevel": 88, "doublesMoves": ["bodyslam", "explosion", "helpinghand", "icywind", "knockoff"] }, "rhyperior": { - "level": 79, + "level": 80, "moves": ["earthquake", "firepunch", "megahorn", "rockpolish", "stoneedge"], "doublesLevel": 84, "doublesMoves": ["highhorsepower", "icepunch", "megahorn", "protect", "rockslide", "stoneedge"] @@ -1095,7 +1095,7 @@ "doublesMoves": ["focusblast", "knockoff", "powerwhip", "ragepowder", "sleeppowder"] }, "electivire": { - "level": 83, + "level": 82, "moves": ["crosschop", "earthquake", "flamethrower", "icepunch", "voltswitch", "wildcharge"], "doublesLevel": 88, "doublesMoves": ["crosschop", "flamethrower", "icepunch", "stompingtantrum", "wildcharge"] @@ -1228,7 +1228,7 @@ "doublesMoves": ["earthpower", "eruption", "flashcannon", "heatwave", "protect"] }, "regigigas": { - "level": 82, + "level": 83, "moves": ["bodyslam", "protect", "substitute", "toxic"], "doublesLevel": 86, "doublesMoves": ["bodyslam", "knockoff", "protect", "thunderwave"] @@ -1265,7 +1265,7 @@ "doublesMoves": ["facade", "helpinghand", "superpower", "thunderwave"] }, "liepard": { - "level": 91, + "level": 92, "moves": ["copycat", "encore", "knockoff", "playrough", "thunderwave", "uturn"], "doublesLevel": 88, "doublesMoves": ["copycat", "encore", "fakeout", "foulplay", "snarl", "taunt", "thunderwave"] @@ -1388,7 +1388,7 @@ "doublesMoves": ["acupressure", "helpinghand", "leafstorm", "leechseed", "spikyshield"] }, "crustle": { - "level": 81, + "level": 82, "moves": ["earthquake", "shellsmash", "stoneedge", "xscissor"], "doublesLevel": 84, "doublesMoves": ["knockoff", "protect", "rockslide", "shellsmash", "xscissor"] @@ -1454,7 +1454,7 @@ "doublesMoves": ["focusblast", "protect", "psychic", "shadowball", "trickroom"] }, "vanilluxe": { - "level": 82, + "level": 81, "moves": ["auroraveil", "blizzard", "explosion", "flashcannon", "freezedry"], "doublesLevel": 82, "doublesMoves": ["auroraveil", "blizzard", "explosion", "freezedry", "protect"] @@ -1466,7 +1466,7 @@ "doublesMoves": ["acrobatics", "helpinghand", "nuzzle", "tailwind", "taunt", "voltswitch"] }, "escavalier": { - "level": 83, + "level": 82, "moves": ["closecombat", "drillrun", "ironhead", "knockoff", "megahorn", "swordsdance"], "doublesLevel": 86, "doublesMoves": ["closecombat", "drillrun", "ironhead", "knockoff", "megahorn", "protect", "swordsdance"] @@ -1478,7 +1478,7 @@ "doublesMoves": ["clearsmog", "pollenpuff", "protect", "ragepowder", "spore"] }, "jellicent": { - "level": 86, + "level": 87, "moves": ["icebeam", "recover", "scald", "shadowball", "toxic", "willowisp"], "doublesLevel": 84, "doublesMoves": ["scald", "shadowball", "strengthsap", "trickroom", "willowisp"] @@ -1539,7 +1539,7 @@ "noDynamaxMoves": ["bugbuzz", "encore", "energyball", "focusblast", "spikes", "toxic"] }, "stunfisk": { - "level": 83, + "level": 84, "moves": ["discharge", "earthpower", "foulplay", "sludgebomb", "stealthrock"], "doublesLevel": 88, "doublesMoves": ["earthpower", "electroweb", "foulplay", "stealthrock", "thunderbolt"] @@ -1563,7 +1563,7 @@ "doublesMoves": ["dragonclaw", "firepunch", "glare", "gunkshot", "protect", "suckerpunch"] }, "golurk": { - "level": 82, + "level": 83, "moves": ["dynamicpunch", "earthquake", "poltergeist", "rockpolish", "stoneedge"], "doublesLevel": 86, "doublesMoves": ["dynamicpunch", "highhorsepower", "icepunch", "poltergeist", "protect"] @@ -1813,19 +1813,19 @@ "doublesMoves": ["closecombat", "dragonclaw", "dragondance", "headsmash", "highhorsepower"] }, "aurorus": { - "level": 84, + "level": 85, "moves": ["ancientpower", "blizzard", "earthpower", "freezedry", "stealthrock", "thunderwave"], "doublesLevel": 88, "doublesMoves": ["auroraveil", "blizzard", "earthpower", "freezedry", "protect", "thunderwave"] }, "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"] }, "hawlucha": { - "level": 78, + "level": 79, "moves": ["bravebird", "closecombat", "roost", "stoneedge", "swordsdance", "throatchop"], "doublesLevel": 80, "doublesMoves": ["bravebird", "closecombat", "protect", "swordsdance"] @@ -1867,7 +1867,7 @@ "doublesMoves": ["leechseed", "poltergeist", "powerwhip", "substitute", "willowisp"] }, "gourgeistsmall": { - "level": 82, + "level": 83, "moves": ["leechseed", "poltergeist", "powerwhip", "substitute", "willowisp"], "doublesLevel": 88, "doublesMoves": ["leechseed", "poltergeist", "powerwhip", "substitute", "willowisp"] @@ -1897,7 +1897,7 @@ "doublesMoves": ["boomburst", "dracometeor", "flamethrower", "hurricane", "protect", "tailwind"] }, "xerneas": { - "level": 65, + "level": 64, "moves": ["focusblast", "geomancy", "moonblast", "psyshock"], "doublesLevel": 70, "doublesMoves": ["dazzlinggleam", "focusblast", "geomancy", "moonblast", "thunderbolt"] @@ -1946,7 +1946,7 @@ "doublesMoves": ["fakeout", "flareblitz", "knockoff", "partingshot", "uturn"] }, "primarina": { - "level": 80, + "level": 81, "moves": ["energyball", "hydropump", "moonblast", "psychic", "scald"], "doublesLevel": 82, "doublesMoves": ["dazzlinggleam", "flipturn", "hypervoice", "moonblast", "protect", "psychic"] @@ -2066,7 +2066,7 @@ "doublesMoves": ["hypnosis", "protect", "scorchingsands", "shadowball", "shoreup", "stealthrock"] }, "pyukumuku": { - "level": 86, + "level": 85, "moves": ["counter", "mirrorcoat", "recover", "toxic"], "doublesLevel": 100, "doublesMoves": ["helpinghand", "lightscreen", "memento", "reflect"] @@ -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"] }, @@ -2214,7 +2214,7 @@ "doublesMoves": ["anchorshot", "knockoff", "powerwhip", "protect"] }, "kommoo": { - "level": 80, + "level": 81, "moves": ["clangingscales", "clangoroussoul", "closecombat", "poisonjab", "stealthrock"], "doublesLevel": 80, "doublesMoves": ["bodypress", "dracometeor", "irondefense", "protect"] @@ -2318,7 +2318,7 @@ "doublesMoves": ["heatwave", "moongeistbeam", "photongeyser", "protect", "thunderwave"] }, "magearna": { - "level": 73, + "level": 72, "moves": ["agility", "calmmind", "flashcannon", "fleurcannon"], "doublesLevel": 72, "doublesMoves": ["agility", "aurasphere", "dazzlinggleam", "flashcannon", "fleurcannon", "protect", "trick"] @@ -2355,7 +2355,7 @@ "doublesMoves": ["closecombat", "fakeout", "grassknot", "knockoff", "plasmafists", "snarl"] }, "melmetal": { - "level": 73, + "level": 72, "moves": ["doubleironbash", "earthquake", "superpower", "thunderpunch", "thunderwave"], "doublesLevel": 76, "doublesMoves": ["acidarmor", "bodypress", "doubleironbash", "protect", "thunderpunch", "thunderwave"] @@ -2480,7 +2480,7 @@ "doublesMoves": ["bravebird", "icebeam", "protect", "roost", "surf", "tailwind"] }, "barraskewda": { - "level": 80, + "level": 79, "moves": ["closecombat", "crunch", "flipturn", "liquidation"], "doublesLevel": 84, "doublesMoves": ["closecombat", "drillrun", "flipturn", "liquidation", "poisonjab"] @@ -2654,13 +2654,13 @@ "doublesMoves": ["blizzard", "boltbeak", "iciclecrash", "lowkick", "protect"] }, "dracovish": { - "level": 77, + "level": 78, "moves": ["crunch", "fishiousrend", "icefang", "lowkick", "psychicfangs"], "doublesLevel": 78, "doublesMoves": ["crunch", "dragonrush", "fishiousrend", "icefang", "psychicfangs"] }, "arctovish": { - "level": 87, + "level": 88, "moves": ["bodyslam", "fishiousrend", "freezedry", "iciclecrash", "psychicfangs"], "doublesLevel": 88, "doublesMoves": ["blizzard", "fishiousrend", "iciclecrash", "protect", "superfang"] @@ -2678,25 +2678,25 @@ "doublesMoves": ["dragondarts", "fireblast", "protect", "shadowball", "thunderbolt", "thunderwave"] }, "zacian": { - "level": 66, + "level": 67, "moves": ["closecombat", "crunch", "playrough", "psychicfangs", "swordsdance"], "doublesLevel": 72, "doublesMoves": ["closecombat", "crunch", "playrough", "protect", "psychicfangs", "swordsdance"] }, "zaciancrowned": { - "level": 61, + "level": 62, "moves": ["behemothblade", "closecombat", "playrough", "psychicfangs", "swordsdance"], "doublesLevel": 65, "doublesMoves": ["behemothblade", "closecombat", "playrough", "protect", "psychicfangs", "swordsdance"] }, "zamazenta": { - "level": 69, + "level": 70, "moves": ["closecombat", "crunch", "psychicfangs", "wildcharge"], "doublesLevel": 74, "doublesMoves": ["closecombat", "crunch", "playrough", "protect", "psychicfangs"] }, "zamazentacrowned": { - "level": 68, + "level": 67, "moves": ["behemothbash", "closecombat", "crunch", "howl", "psychicfangs"], "doublesLevel": 72, "doublesMoves": ["behemothbash", "closecombat", "crunch", "howl", "protect"] @@ -2734,7 +2734,7 @@ "doublesMoves": ["closecombat", "darkestlariat", "junglehealing", "powerwhip", "protect"] }, "regieleki": { - "level": 78, + "level": 77, "moves": ["explosion", "substitute", "thunderbolt", "voltswitch"], "doublesLevel": 82, "doublesMoves": ["electroweb", "extremespeed", "protect", "thundercage", "voltswitch"], @@ -2759,7 +2759,7 @@ "doublesMoves": ["darkpulse", "nastyplot", "protect", "shadowball"] }, "calyrex": { - "level": 88, + "level": 89, "moves": ["calmmind", "gigadrain", "leechseed", "psyshock", "substitute"], "doublesLevel": 94, "doublesMoves": ["helpinghand", "leafstorm", "pollenpuff", "protect"] diff --git a/data/random-battles/gen8/teams.ts b/data/random-battles/gen8/teams.ts index 6daf9528f1..468d4b932f 100644 --- a/data/random-battles/gen8/teams.ts +++ b/data/random-battles/gen8/teams.ts @@ -1526,7 +1526,7 @@ export class RandomGen8Teams { case 'Cloud Nine': return (!isNoDynamax || species.id !== 'golduck'); case 'Competitive': - return (!counter.get('Special') || moves.has('rest') && moves.has('sleeptalk')); + return species.id === 'boltund'; case 'Compound Eyes': case 'No Guard': return !counter.get('inaccurate'); case 'Cursed Body': 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..946b35da98 100644 --- a/data/random-battles/gen9/doubles-sets.json +++ b/data/random-battles/gen9/doubles-sets.json @@ -1,6 +1,6 @@ { "venusaur": { - "level": 86, + "level": 87, "sets": [ { "role": "Offensive Protect", @@ -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"] } @@ -150,15 +150,15 @@ "sets": [ { "role": "Doubles Bulky Attacker", - "movepool": ["Heal Pulse", "Icy Wind", "Knock Off", "Life Dew", "Moonblast", "Thunder Wave"], - "abilities": ["Magic Guard", "Unaware"], - "teraTypes": ["Fire", "Steel", "Water"] + "movepool": ["Dazzling Gleam", "Fire Blast", "Icy Wind", "Moonblast", "Protect", "Thunder Wave"], + "abilities": ["Magic Guard"], + "teraTypes": ["Fire", "Steel"] }, { "role": "Doubles Support", - "movepool": ["Encore", "Fire Blast", "Follow Me", "Helping Hand", "Life Dew", "Moonblast", "Moonlight"], + "movepool": ["Follow Me", "Helping Hand", "Knock Off", "Life Dew", "Moonblast", "Moonlight"], "abilities": ["Unaware"], - "teraTypes": ["Fire", "Steel", "Water"] + "teraTypes": ["Steel", "Water"] } ] }, @@ -186,7 +186,7 @@ "role": "Doubles Support", "movepool": ["Aurora Veil", "Blizzard", "Moonblast", "Protect"], "abilities": ["Snow Warning"], - "teraTypes": ["Ice", "Steel", "Water"] + "teraTypes": ["Steel", "Water"] } ] }, @@ -195,7 +195,7 @@ "sets": [ { "role": "Doubles Support", - "movepool": ["Dazzling Gleam", "Disable", "Encore", "Fire Blast", "Heal Pulse", "Helping Hand", "Icy Wind", "Thunder Wave"], + "movepool": ["Dazzling Gleam", "Encore", "Fire Blast", "Helping Hand", "Icy Wind", "Thunder Wave"], "abilities": ["Competitive"], "teraTypes": ["Fire", "Steel"] } @@ -209,6 +209,18 @@ "movepool": ["Pollen Puff", "Sludge Bomb", "Strength Sap", "Stun Spore"], "abilities": ["Effect Spore"], "teraTypes": ["Steel", "Water"] + }, + { + "role": "Doubles Bulky Attacker", + "movepool": ["Energy Ball", "Sludge Bomb", "Strength Sap", "Stun Spore"], + "abilities": ["Effect Spore"], + "teraTypes": ["Steel", "Water"] + }, + { + "role": "Bulky Protect", + "movepool": ["Leech Seed", "Pollen Puff", "Protect", "Sludge Bomb"], + "abilities": ["Effect Spore"], + "teraTypes": ["Steel", "Water"] } ] }, @@ -349,7 +361,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,7 +463,7 @@ "sets": [ { "role": "Doubles Bulky Attacker", - "movepool": ["Drain Punch", "Gunk Shot", "Haze", "Helping Hand", "Ice Punch", "Knock Off", "Poison Gas", "Poison Jab", "Shadow Sneak"], + "movepool": ["Drain Punch", "Gunk Shot", "Helping Hand", "Ice Punch", "Knock Off", "Poison Jab", "Shadow Sneak", "Toxic Spikes"], "abilities": ["Poison Touch"], "teraTypes": ["Dark"] } @@ -589,26 +601,26 @@ "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"] } ] }, "weezinggalar": { - "level": 88, + "level": 89, "sets": [ { "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"] } ] @@ -814,7 +826,7 @@ "sets": [ { "role": "Doubles Wallbreaker", - "movepool": ["Crunch", "Double-Edge", "Hammer Arm", "Heat Crash", "High Horsepower"], + "movepool": ["Body Slam", "Crunch", "Double-Edge", "Hammer Arm", "Heat Crash", "High Horsepower"], "abilities": ["Thick Fat"], "teraTypes": ["Fire", "Ghost", "Ground"] }, @@ -825,9 +837,9 @@ "teraTypes": ["Ghost", "Ground"] }, { - "role": "Doubles Bulky Setup", - "movepool": ["Body Slam", "Crunch", "Curse", "High Horsepower", "Protect", "Recycle"], - "abilities": ["Gluttony"], + "role": "Bulky Protect", + "movepool": ["Body Slam", "Curse", "High Horsepower", "Protect"], + "abilities": ["Thick Fat"], "teraTypes": ["Ground", "Poison"] } ] @@ -848,7 +860,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 +898,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"] } ] }, @@ -1166,7 +1184,7 @@ "level": 91, "sets": [ { - "role": "Doubles Bulky Attacker", + "role": "Doubles Support", "movepool": ["Helping Hand", "High Horsepower", "Icy Wind", "Liquidation", "Recover", "Yawn"], "abilities": ["Unaware", "Water Absorb"], "teraTypes": ["Fire", "Poison", "Steel"] @@ -1289,7 +1307,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"] } @@ -1389,10 +1413,16 @@ "level": 86, "sets": [ { - "role": "Doubles Fast Attacker", + "role": "Offensive Protect", "movepool": ["Dark Pulse", "Heat Wave", "Nasty Plot", "Protect", "Sucker Punch"], "abilities": ["Flash Fire", "Unnerve"], "teraTypes": ["Dark", "Fire", "Ghost", "Grass"] + }, + { + "role": "Doubles Fast Attacker", + "movepool": ["Dark Pulse", "Heat Wave", "Nasty Plot", "Protect"], + "abilities": ["Flash Fire", "Unnerve"], + "teraTypes": ["Dark", "Fire", "Ghost", "Grass"] } ] }, @@ -1538,7 +1568,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", @@ -1608,8 +1638,8 @@ "level": 82, "sets": [ { - "role": "Doubles Bulky Attacker", - "movepool": ["Flip Turn", "High Horsepower", "Ice Beam", "Icy Wind", "Knock Off", "Muddy Water"], + "role": "Doubles Support", + "movepool": ["Flip Turn", "High Horsepower", "Icy Wind", "Knock Off", "Muddy Water"], "abilities": ["Torrent"], "teraTypes": ["Fire", "Steel"] } @@ -1644,10 +1674,10 @@ ] }, "shiftry": { - "level": 84, + "level": 83, "sets": [ { - "role": "Doubles Fast Attacker", + "role": "Doubles Wallbreaker", "movepool": ["Fake Out", "Knock Off", "Leaf Blade", "Tailwind"], "abilities": ["Wind Rider"], "teraTypes": ["Ghost"] @@ -1672,7 +1702,7 @@ ] }, "gardevoir": { - "level": 83, + "level": 82, "sets": [ { "role": "Choice Item user", @@ -1706,7 +1736,7 @@ ] }, "breloom": { - "level": 84, + "level": 83, "sets": [ { "role": "Doubles Fast Attacker", @@ -1721,7 +1751,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"] } @@ -1799,7 +1835,7 @@ "level": 92, "sets": [ { - "role": "Doubles Fast Attacker", + "role": "Doubles Setup Sweeper", "movepool": ["Alluring Voice", "Nasty Plot", "Protect", "Thunderbolt"], "abilities": ["Lightning Rod"], "teraTypes": ["Flying"] @@ -1856,7 +1892,7 @@ "sets": [ { "role": "Doubles Bulky Attacker", - "movepool": ["Encore", "Gunk Shot", "Helping Hand", "Knock Off", "Poison Gas", "Thunder Wave", "Toxic Spikes"], + "movepool": ["Encore", "Gunk Shot", "Helping Hand", "Knock Off", "Thunder Wave", "Toxic Spikes"], "abilities": ["Gluttony"], "teraTypes": ["Dark"] } @@ -1924,7 +1960,7 @@ ] }, "altaria": { - "level": 91, + "level": 90, "sets": [ { "role": "Doubles Bulky Attacker", @@ -1963,7 +1999,7 @@ { "role": "Offensive Protect", "movepool": ["Flamethrower", "Glare", "Gunk Shot", "Knock Off", "Protect"], - "abilities": ["Infiltrator"], + "abilities": ["Shed Skin"], "teraTypes": ["Dark", "Fire", "Poison"] } ] @@ -1972,7 +2008,7 @@ "level": 88, "sets": [ { - "role": "Doubles Bulky Attacker", + "role": "Doubles Support", "movepool": ["Helping Hand", "High Horsepower", "Icy Wind", "Muddy Water", "Protect"], "abilities": ["Oblivious"], "teraTypes": ["Fire", "Steel"] @@ -2019,7 +2055,7 @@ ] }, "tropius": { - "level": 94, + "level": 93, "sets": [ { "role": "Doubles Support", @@ -2289,6 +2325,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": ["Shell Armor"], + "teraTypes": ["Rock"] } ] }, @@ -2423,9 +2471,15 @@ "gastrodon": { "level": 82, "sets": [ + { + "role": "Doubles Support", + "movepool": ["Earth Power", "Helping Hand", "Icy Wind", "Muddy Water", "Recover", "Yawn"], + "abilities": ["Storm Drain"], + "teraTypes": ["Fire"] + }, { "role": "Doubles Bulky Attacker", - "movepool": ["Clear Smog", "Earth Power", "Helping Hand", "Icy Wind", "Muddy Water", "Recover"], + "movepool": ["Earth Power", "Ice Beam", "Recover", "Yawn"], "abilities": ["Storm Drain"], "teraTypes": ["Fire"] } @@ -2555,7 +2609,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"] } ] }, @@ -2564,7 +2618,13 @@ "sets": [ { "role": "Doubles Fast Attacker", - "movepool": ["Close Combat", "Fake Out", "Gunk Shot", "Protect", "Sucker Punch", "Swords Dance"], + "movepool": ["Close Combat", "Fake Out", "Gunk Shot", "Protect", "Sucker Punch"], + "abilities": ["Dry Skin"], + "teraTypes": ["Dark", "Fighting", "Poison"] + }, + { + "role": "Doubles Setup Sweeper", + "movepool": ["Close Combat", "Gunk Shot", "Protect", "Sucker Punch", "Swords Dance"], "abilities": ["Dry Skin"], "teraTypes": ["Dark", "Fighting", "Poison"] } @@ -2604,7 +2664,7 @@ ] }, "sneasler": { - "level": 77, + "level": 76, "sets": [ { "role": "Doubles Wallbreaker", @@ -2624,9 +2684,9 @@ "level": 84, "sets": [ { - "role": "Doubles Bulky Attacker", - "movepool": ["Body Press", "Electroweb", "Flash Cannon", "Protect", "Thunderbolt", "Volt Switch"], - "abilities": ["Sturdy"], + "role": "Doubles Support", + "movepool": ["Electroweb", "Flash Cannon", "Protect", "Thunderbolt", "Volt Switch"], + "abilities": ["Magnet Pull"], "teraTypes": ["Flying"] } ] @@ -2653,13 +2713,13 @@ "sets": [ { "role": "Doubles Fast Attacker", - "movepool": ["Cross Chop", "Flamethrower", "Ice Punch", "Protect", "Volt Switch", "Wild Charge"], + "movepool": ["Flamethrower", "Ice Punch", "Protect", "Wild Charge"], "abilities": ["Motor Drive"], "teraTypes": ["Flying"] }, { "role": "Doubles Bulky Attacker", - "movepool": ["Cross Chop", "Flamethrower", "Ice Punch", "Knock Off", "Volt Switch", "Wild Charge"], + "movepool": ["Electroweb", "Ice Punch", "Knock Off", "Volt Switch", "Wild Charge"], "abilities": ["Motor Drive"], "teraTypes": ["Flying"] } @@ -2670,7 +2730,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"] }, @@ -2691,6 +2751,12 @@ "abilities": ["Tinted Lens"], "teraTypes": ["Bug"] }, + { + "role": "Doubles Fast Attacker", + "movepool": ["Air Slash", "Bug Buzz", "Protect", "Tailwind"], + "abilities": ["Tinted Lens"], + "teraTypes": ["Ground", "Steel"] + }, { "role": "Tera Blast user", "movepool": ["Air Slash", "Bug Buzz", "Protect", "Tera Blast"], @@ -2931,17 +2997,17 @@ "azelf": { "level": 83, "sets": [ - { - "role": "Doubles Fast Attacker", - "movepool": ["Dazzling Gleam", "Energy Ball", "Fire Blast", "Nasty Plot", "Psychic", "U-turn"], - "abilities": ["Levitate"], - "teraTypes": ["Fairy", "Fire"] - }, { "role": "Offensive Protect", "movepool": ["Dazzling Gleam", "Fire Blast", "Nasty Plot", "Protect", "Psychic", "Thunderbolt"], "abilities": ["Levitate"], "teraTypes": ["Electric", "Fairy", "Fire"] + }, + { + "role": "Doubles Wallbreaker", + "movepool": ["Dazzling Gleam", "Fire Blast", "Psychic", "U-turn"], + "abilities": ["Levitate"], + "teraTypes": ["Fairy", "Fire"] } ] }, @@ -3163,13 +3229,19 @@ ] }, "arceusdragon": { - "level": 73, + "level": 72, "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 +3261,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,26 +3300,26 @@ "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"] } ] }, "arceusghost": { - "level": 72, + "level": 71, "sets": [ - { - "role": "Doubles Setup Sweeper", - "movepool": ["Brick Break", "Extreme Speed", "Phantom Force", "Swords Dance"], - "abilities": ["Multitype"], - "teraTypes": ["Ghost", "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 +3339,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 +3361,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"] } ] }, @@ -3417,13 +3501,13 @@ "level": 87, "sets": [ { - "role": "Offensive Protect", + "role": "Doubles Fast Attacker", "movepool": ["High Horsepower", "Overheat", "Protect", "Wild Charge"], "abilities": ["Sap Sipper"], "teraTypes": ["Ground"] }, { - "role": "Doubles Fast Attacker", + "role": "Doubles Wallbreaker", "movepool": ["High Horsepower", "Overheat", "Protect", "Thunderbolt"], "abilities": ["Lightning Rod"], "teraTypes": ["Flying", "Water"] @@ -3486,7 +3570,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"] } @@ -3787,15 +3877,21 @@ "sets": [ { "role": "Doubles Fast Attacker", - "movepool": ["Close Combat", "Fake Out", "Knock Off", "Triple Axel", "U-turn"], + "movepool": ["Close Combat", "Fake Out", "Knock Off", "U-turn"], "abilities": ["Regenerator"], - "teraTypes": ["Dark"] + "teraTypes": ["Dark", "Steel"] }, { "role": "Doubles Bulky Attacker", "movepool": ["Close Combat", "Fake Out", "Knock Off", "U-turn"], "abilities": ["Regenerator"], "teraTypes": ["Dark", "Steel"] + }, + { + "role": "Doubles Wallbreaker", + "movepool": ["Close Combat", "Knock Off", "Triple Axel", "U-turn"], + "abilities": ["Inner Focus"], + "teraTypes": ["Dark", "Steel"] } ] }, @@ -3884,7 +3980,7 @@ { "role": "Doubles Setup Sweeper", "movepool": ["Bug Buzz", "Heat Wave", "Protect", "Quiver Dance"], - "abilities": ["Flame Body", "Swarm"], + "abilities": ["Flame Body"], "teraTypes": ["Fire", "Ground", "Water"] }, { @@ -3952,7 +4048,7 @@ ] }, "tornadustherian": { - "level": 77, + "level": 78, "sets": [ { "role": "Doubles Setup Sweeper", @@ -3972,14 +4068,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"] }, @@ -4191,10 +4287,16 @@ "level": 88, "sets": [ { - "role": "Doubles Support", + "role": "Doubles Fast Attacker", "movepool": ["Hurricane", "Pollen Puff", "Protect", "Sleep Powder"], "abilities": ["Compound Eyes"], "teraTypes": ["Flying", "Steel"] + }, + { + "role": "Doubles Fast Attacker", + "movepool": ["Hurricane", "Protect", "Sleep Powder", "Tailwind"], + "abilities": ["Compound Eyes"], + "teraTypes": ["Flying", "Steel"] } ] }, @@ -4242,13 +4344,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"] } @@ -4305,7 +4401,7 @@ ] }, "sylveon": { - "level": 79, + "level": 78, "sets": [ { "role": "Bulky Protect", @@ -4317,7 +4413,7 @@ "role": "Tera Blast user", "movepool": ["Hyper Voice", "Protect", "Quick Attack", "Tera Blast"], "abilities": ["Pixilate"], - "teraTypes": ["Fire", "Ground"] + "teraTypes": ["Ground"] } ] }, @@ -4454,9 +4550,9 @@ }, { "role": "Bulky Protect", - "movepool": ["Diamond Storm", "Moonblast", "Protect", "Trick Room"], + "movepool": ["Body Press", "Diamond Storm", "Moonblast", "Trick Room"], "abilities": ["Clear Body"], - "teraTypes": ["Grass", "Steel"] + "teraTypes": ["Fighting"] } ] }, @@ -4542,8 +4638,8 @@ "teraTypes": ["Water"] }, { - "role": "Bulky Protect", - "movepool": ["Calm Mind", "Hyper Voice", "Moonblast", "Protect"], + "role": "Offensive Protect", + "movepool": ["Hyper Voice", "Icy Wind", "Life Dew", "Moonblast", "Protect"], "abilities": ["Liquid Voice"], "teraTypes": ["Grass", "Steel"] } @@ -4567,7 +4663,7 @@ ] }, "gumshoos": { - "level": 93, + "level": 94, "sets": [ { "role": "Choice Item user", @@ -4582,7 +4678,7 @@ "sets": [ { "role": "Bulky Protect", - "movepool": ["Bug Buzz", "Electroweb", "Protect", "Sticky Web", "Thunderbolt"], + "movepool": ["Bug Buzz", "Protect", "Sticky Web", "Thunderbolt"], "abilities": ["Levitate"], "teraTypes": ["Electric"] } @@ -4593,7 +4689,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 +4705,7 @@ "teraTypes": ["Ground"] }, { - "role": "Doubles Bulky Setup", + "role": "Bulky Protect", "movepool": ["Air Slash", "Protect", "Quiver Dance", "Revelation Dance"], "abilities": ["Dancer"], "teraTypes": ["Ground"] @@ -4626,7 +4722,7 @@ "teraTypes": ["Ground"] }, { - "role": "Doubles Bulky Setup", + "role": "Bulky Protect", "movepool": ["Air Slash", "Protect", "Quiver Dance", "Revelation Dance"], "abilities": ["Dancer"], "teraTypes": ["Ground"] @@ -4643,7 +4739,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 +4756,7 @@ "teraTypes": ["Fighting", "Ground"] }, { - "role": "Doubles Bulky Setup", + "role": "Bulky Protect", "movepool": ["Air Slash", "Protect", "Quiver Dance", "Revelation Dance"], "abilities": ["Dancer"], "teraTypes": ["Fighting", "Ground"] @@ -4671,7 +4767,7 @@ "level": 86, "sets": [ { - "role": "Doubles Support", + "role": "Doubles Fast Attacker", "movepool": ["Moonblast", "Pollen Puff", "Protect", "Tailwind"], "abilities": ["Shield Dust"], "teraTypes": ["Steel"] @@ -4685,7 +4781,7 @@ ] }, "lycanroc": { - "level": 85, + "level": 84, "sets": [ { "role": "Offensive Protect", @@ -4790,7 +4886,7 @@ "sets": [ { "role": "Doubles Fast Attacker", - "movepool": ["Encore", "Fake Out", "Fire Blast", "Heat Wave", "Poison Gas", "Protect", "Sludge Bomb"], + "movepool": ["Encore", "Fake Out", "Fire Blast", "Heat Wave", "Protect", "Sludge Bomb"], "abilities": ["Corrosion"], "teraTypes": ["Fire", "Flying", "Water"] } @@ -4863,7 +4959,7 @@ ] }, "komala": { - "level": 92, + "level": 93, "sets": [ { "role": "Doubles Bulky Attacker", @@ -5010,13 +5106,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 +5369,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 +5572,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"] }, @@ -5673,7 +5775,7 @@ ] }, "calyrexshadow": { - "level": 63, + "level": 62, "sets": [ { "role": "Offensive Protect", @@ -5817,15 +5919,15 @@ "sets": [ { "role": "Doubles Support", - "movepool": ["Double-Edge", "Helping Hand", "Lash Out", "Protect", "Yawn"], - "abilities": ["Gluttony"], + "movepool": ["Double-Edge", "Helping Hand", "Protect", "Yawn"], + "abilities": ["Thick Fat"], "teraTypes": ["Ghost", "Normal"] }, { "role": "Doubles Wallbreaker", - "movepool": ["Double-Edge", "High Horsepower", "Lash Out", "Play Rough"], + "movepool": ["Body Slam", "Double-Edge", "High Horsepower", "Lash Out"], "abilities": ["Thick Fat"], - "teraTypes": ["Fairy", "Ground", "Normal"] + "teraTypes": ["Ghost", "Ground", "Normal"] } ] }, @@ -5834,15 +5936,15 @@ "sets": [ { "role": "Doubles Support", - "movepool": ["Double-Edge", "Helping Hand", "Lash Out", "Protect", "Yawn"], - "abilities": ["Gluttony"], + "movepool": ["Double-Edge", "Helping Hand", "Protect", "Yawn"], + "abilities": ["Thick Fat"], "teraTypes": ["Ghost", "Normal"] }, { "role": "Doubles Wallbreaker", - "movepool": ["Double-Edge", "High Horsepower", "Lash Out", "Play Rough"], + "movepool": ["Body Slam", "Double-Edge", "High Horsepower", "Lash Out"], "abilities": ["Thick Fat"], - "teraTypes": ["Fairy", "Ground", "Normal"] + "teraTypes": ["Ghost", "Ground", "Normal"] } ] }, @@ -5867,8 +5969,14 @@ "teraTypes": ["Bug"] }, { - "role": "Doubles Fast Attacker", - "movepool": ["First Impression", "Leech Life", "Protect", "Sucker Punch"], + "role": "Doubles Wallbreaker", + "movepool": ["First Impression", "Knock Off", "Protect", "Sucker Punch"], + "abilities": ["Tinted Lens"], + "teraTypes": ["Bug", "Dark"] + }, + { + "role": "Offensive Protect", + "movepool": ["First Impression", "Knock Off", "Leech Life", "Protect"], "abilities": ["Tinted Lens"], "teraTypes": ["Bug"] } @@ -6018,7 +6126,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"] } @@ -6032,6 +6140,12 @@ "movepool": ["Hurricane", "Protect", "Tailwind", "Thunderbolt"], "abilities": ["Competitive"], "teraTypes": ["Flying", "Steel"] + }, + { + "role": "Doubles Wallbreaker", + "movepool": ["Hurricane", "Protect", "Tailwind", "Thunderbolt"], + "abilities": ["Competitive"], + "teraTypes": ["Flying", "Steel"] } ] }, @@ -6159,7 +6273,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"] } ] @@ -6244,7 +6358,7 @@ ] }, "orthworm": { - "level": 88, + "level": 89, "sets": [ { "role": "Bulky Protect", @@ -6490,7 +6604,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"] } @@ -6583,6 +6697,12 @@ "ironbundle": { "level": 78, "sets": [ + { + "role": "Doubles Wallbreaker", + "movepool": ["Encore", "Freeze-Dry", "Hydro Pump", "Icy Wind", "Protect"], + "abilities": ["Quark Drive"], + "teraTypes": ["Dragon", "Water"] + }, { "role": "Doubles Fast Attacker", "movepool": ["Encore", "Freeze-Dry", "Hydro Pump", "Icy Wind", "Protect"], @@ -6718,12 +6838,6 @@ "movepool": ["Collision Course", "Dragon Claw", "Flare Blitz", "U-turn"], "abilities": ["Orichalcum Pulse"], "teraTypes": ["Fire"] - }, - { - "role": "Offensive Protect", - "movepool": ["Collision Course", "Dragon Claw", "Flare Blitz", "Protect"], - "abilities": ["Orichalcum Pulse"], - "teraTypes": ["Fire"] } ] }, @@ -7043,7 +7157,7 @@ "level": 73, "sets": [ { - "role": "Doubles Bulky Setup", + "role": "Bulky Protect", "movepool": ["Calm Mind", "Earth Power", "Protect", "Tera Starstorm"], "abilities": ["Tera Shift"], "teraTypes": ["Stellar"] diff --git a/data/random-battles/gen9/sets.json b/data/random-battles/gen9/sets.json index bf8b2e3984..c4f31db372 100644 --- a/data/random-battles/gen9/sets.json +++ b/data/random-battles/gen9/sets.json @@ -77,7 +77,7 @@ "level": 93, "sets": [ { - "role": "Fast Attacker", + "role": "AV Pivot", "movepool": ["Fake Out", "Knock Off", "Play Rough", "Surf", "Volt Switch", "Volt Tackle"], "abilities": ["Lightning Rod"], "teraTypes": ["Water"] @@ -185,7 +185,7 @@ }, { "role": "Fast Attacker", - "movepool": ["Aurora Veil", "Blizzard", "Freeze-Dry", "Moonblast", "Nasty Plot"], + "movepool": ["Aurora Veil", "Blizzard", "Freeze-Dry", "Moonblast"], "abilities": ["Snow Warning"], "teraTypes": ["Steel", "Water"] } @@ -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"] } ] }, @@ -2130,7 +2136,7 @@ "sets": [ { "role": "Bulky Attacker", - "movepool": ["Clear Smog", "Earthquake", "Encore", "Ice Beam", "Knock Off", "Pain Split", "Sludge Bomb", "Toxic Spikes"], + "movepool": ["Clear Smog", "Earthquake", "Encore", "Ice Beam", "Knock Off", "Pain Split", "Sludge Bomb", "Thunder Wave", "Toxic Spikes"], "abilities": ["Liquid Ooze"], "teraTypes": ["Dark"] }, @@ -2373,7 +2379,7 @@ "sets": [ { "role": "Fast Support", - "movepool": ["Disable", "Earthquake", "Freeze-Dry", "Spikes", "Taunt"], + "movepool": ["Earthquake", "Freeze-Dry", "Spikes", "Taunt"], "abilities": ["Inner Focus"], "teraTypes": ["Ghost", "Ground", "Water"] } @@ -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"], @@ -2700,7 +2712,7 @@ "sets": [ { "role": "Fast Support", - "movepool": ["Knock Off", "Pounce", "Sticky Web", "Swords Dance", "Taunt"], + "movepool": ["Knock Off", "Pounce", "Sticky Web", "Taunt"], "abilities": ["Technician"], "teraTypes": ["Ghost"] } @@ -3051,13 +3063,13 @@ "role": "Fast Attacker", "movepool": ["Body Press", "Flash Cannon", "Thunderbolt", "Volt Switch"], "abilities": ["Analytic", "Magnet Pull"], - "teraTypes": ["Electric", "Fighting", "Flying", "Water"] + "teraTypes": ["Electric", "Fighting", "Flying"] }, { "role": "AV Pivot", "movepool": ["Body Press", "Discharge", "Flash Cannon", "Mirror Coat", "Thunderbolt", "Volt Switch"], "abilities": ["Analytic", "Magnet Pull"], - "teraTypes": ["Flying", "Water"] + "teraTypes": ["Flying"] }, { "role": "Bulky Setup", @@ -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"] }, @@ -3282,13 +3294,19 @@ ] }, "rotomwash": { - "level": 83, + "level": 82, "sets": [ { "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"] } @@ -3381,9 +3405,9 @@ }, { "role": "Fast Attacker", - "movepool": ["Dazzling Gleam", "Fire Blast", "Nasty Plot", "Psychic", "Psyshock", "Thunderbolt", "Trick", "U-turn"], + "movepool": ["Dazzling Gleam", "Fire Blast", "Nasty Plot", "Psychic", "Psyshock", "U-turn"], "abilities": ["Levitate"], - "teraTypes": ["Electric", "Fairy", "Fire", "Psychic"] + "teraTypes": ["Fairy", "Fire", "Psychic"] } ] }, @@ -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"] } ] }, @@ -3794,7 +3812,7 @@ ] }, "arceusice": { - "level": 73, + "level": 72, "sets": [ { "role": "Bulky Setup", @@ -4000,13 +4018,13 @@ "sets": [ { "role": "Fast Support", - "movepool": ["Knock Off", "Leaf Blade", "Lunge", "Sticky Web", "Swords Dance"], + "movepool": ["Knock Off", "Leaf Blade", "Lunge", "Sticky Web"], "abilities": ["Chlorophyll", "Swarm"], "teraTypes": ["Ghost", "Rock"] }, { "role": "Fast Attacker", - "movepool": ["Bullet Seed", "Knock Off", "Sticky Web", "Swords Dance", "Triple Axel"], + "movepool": ["Bullet Seed", "Knock Off", "Sticky Web", "Triple Axel"], "abilities": ["Chlorophyll"], "teraTypes": ["Ghost", "Rock"] } @@ -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"] } @@ -4091,7 +4115,7 @@ ] }, "krookodile": { - "level": 80, + "level": 79, "sets": [ { "role": "Fast Attacker", @@ -4108,7 +4132,7 @@ ] }, "scrafty": { - "level": 84, + "level": 83, "sets": [ { "role": "Bulky Setup", @@ -4249,13 +4273,13 @@ "role": "Bulky Support", "movepool": ["Flip Turn", "Protect", "Scald", "Wish"], "abilities": ["Regenerator"], - "teraTypes": ["Steel"] + "teraTypes": ["Poison", "Steel"] }, { "role": "Fast Support", "movepool": ["Flip Turn", "Protect", "Scald", "Wish"], "abilities": ["Regenerator"], - "teraTypes": ["Steel"] + "teraTypes": ["Poison", "Steel"] } ] }, @@ -4795,7 +4819,7 @@ { "role": "Tera Blast user", "movepool": ["Brave Bird", "Flare Blitz", "Swords Dance", "Tera Blast"], - "abilities": ["Flame Body"], + "abilities": ["Flame Body", "Gale Wings"], "teraTypes": ["Ground"] } ] @@ -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"] }, @@ -5500,7 +5524,7 @@ ] }, "komala": { - "level": 89, + "level": 88, "sets": [ { "role": "Bulky Support", @@ -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", @@ -5543,7 +5567,7 @@ "sets": [ { "role": "Fast Bulky Setup", - "movepool": ["Boomburst", "Clanging Scales", "Clangorous Soul", "Close Combat", "Iron Head"], + "movepool": ["Boomburst", "Clanging Scales", "Clangorous Soul", "Close Combat", "Drain Punch", "Iron Head"], "abilities": ["Soundproof"], "teraTypes": ["Normal", "Steel"] }, @@ -5697,9 +5721,9 @@ }, { "role": "Fast Support", - "movepool": ["Court Change", "High Jump Kick", "Pyro Ball", "Sucker Punch"], + "movepool": ["Court Change", "Pyro Ball", "U-turn", "Will-O-Wisp"], "abilities": ["Libero"], - "teraTypes": ["Fighting", "Fire"] + "teraTypes": ["Grass"] }, { "role": "Fast Attacker", @@ -6464,7 +6488,7 @@ "role": "Bulky Attacker", "movepool": ["Aqua Step", "Close Combat", "Rapid Spin", "Roost", "Swords Dance"], "abilities": ["Moxie"], - "teraTypes": ["Steel"] + "teraTypes": ["Steel"] } ] }, @@ -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"] } @@ -7048,19 +7072,13 @@ ] }, "farigiraf": { - "level": 91, + "level": 90, "sets": [ { "role": "Bulky Support", "movepool": ["Body Slam", "Protect", "Psychic Noise", "Wish"], "abilities": ["Sap Sipper"], "teraTypes": ["Fairy", "Ground", "Water"] - }, - { - "role": "Bulky Attacker", - "movepool": ["Future Sight", "Hyper Voice", "Protect", "Wish"], - "abilities": ["Sap Sipper"], - "teraTypes": ["Fairy", "Ground", "Water"] } ] }, @@ -7122,11 +7140,11 @@ ] }, "brutebonnet": { - "level": 81, + "level": 80, "sets": [ { "role": "Bulky Attacker", - "movepool": ["Close Combat", "Seed Bomb", "Spore", "Sucker Punch"], + "movepool": ["Close Combat", "Crunch", "Spore", "Sucker Punch"], "abilities": ["Protosynthesis"], "teraTypes": ["Fighting", "Poison"] }, @@ -7324,7 +7342,7 @@ "sets": [ { "role": "Fast Attacker", - "movepool": ["Encore", "Flip Turn", "Freeze-Dry", "Hydro Pump", "Ice Beam", "Substitute"], + "movepool": ["Encore", "Flip Turn", "Freeze-Dry", "Hydro Pump", "Ice Beam"], "abilities": ["Quark Drive"], "teraTypes": ["Ice", "Water"] } @@ -7432,7 +7450,7 @@ }, { "role": "Setup Sweeper", - "movepool": ["Ice Shard", "Icicle Crash", "Sacred Sword", "Sucker Punch", "Swords Dance", "Throat Chop"], + "movepool": ["Icicle Crash", "Sacred Sword", "Sucker Punch", "Swords Dance", "Throat Chop"], "abilities": ["Sword of Ruin"], "teraTypes": ["Dark", "Fighting", "Ice"] } @@ -7487,8 +7505,8 @@ "level": 65, "sets": [ { - "role": "Fast Bulky Setup", - "movepool": ["Calm Mind", "Draco Meteor", "Electro Drift", "Substitute"], + "role": "Setup Sweeper", + "movepool": ["Calm Mind", "Draco Meteor", "Dragon Pulse", "Electro Drift"], "abilities": ["Hadron Engine"], "teraTypes": ["Electric"] }, diff --git a/data/random-battles/gen9/teams.ts b/data/random-battles/gen9/teams.ts index 4eaaa10da4..40f8986395 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', @@ -146,7 +146,7 @@ const DOUBLES_NO_LEAD_POKEMON = [ ]; const DEFENSIVE_TERA_BLAST_USERS = [ - 'alcremie', 'bellossom', 'comfey', 'fezandipiti', 'florges', 'raikou', + 'alcremie', 'bellossom', 'comfey', 'fezandipiti', 'florges', ]; function sereneGraceBenefits(move: Move) { @@ -246,7 +246,9 @@ export class RandomTeams { !counter.get('Steel') && (isDoubles || species.baseStats.atk >= 90 || movePool.includes('gigatonhammer') || movePool.includes('makeitrain')) ), - Water: (movePool, moves, abilities, types, counter) => (!counter.get('Water') && !types.includes('Ground')), + Water: (movePool, moves, abilities, types, counter, species, teamDetails, isLead, isDoubles) => ( + !counter.get('Water') && (!types.includes('Ground') || isDoubles) + ), }; this.poolsCacheKey = undefined; this.cachedPool = undefined; @@ -431,7 +433,7 @@ export class RandomTeams { } } // Moves with secondary effects: - if (move.secondary || move.hasSheerForce) { + if (move.secondary || move.hasSheerForceBoost) { counter.add('sheerforce'); if (sereneGraceBenefits(move)) { counter.add('serenegrace'); @@ -501,7 +503,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 +570,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 +817,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 +836,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 +1101,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'; @@ -1170,15 +1159,15 @@ export class RandomTeams { } return this.sample(species.requiredItems); } - if (role === 'AV Pivot') return 'Assault Vest'; if (species.id === 'pikachu') return 'Light Ball'; + if (role === 'AV Pivot') return 'Assault Vest'; if (species.id === 'regieleki') return 'Magnet'; if (types.includes('Normal') && moves.has('doubleedge') && moves.has('fakeout')) return 'Silk Scarf'; if ( species.id === 'froslass' || moves.has('populationbomb') || (ability === 'Hustle' && counter.get('setup') && !isDoubles && this.randomChance(1, 2)) ) return 'Wide Lens'; - if (species.id === 'smeargle' && !isDoubles) return 'Focus Sash'; + if (species.id === 'smeargle') return 'Focus Sash'; if (moves.has('clangoroussoul') || (species.id === 'toxtricity' && moves.has('shiftgear'))) return 'Throat Spray'; if ( (species.baseSpecies === 'Magearna' && role === 'Tera Blast user') || @@ -1298,9 +1287,14 @@ export class RandomTeams { (role === 'Bulky Protect' && counter.get('setup')) || ['irondefense', 'coil', 'acidarmor', 'wish'].some(m => moves.has(m)) || (counter.get('recovery') && !moves.has('strengthsap') && !counter.get('speedcontrol') && !offensiveRole) || + (PROTECT_MOVES.some(m => moves.has(m)) && moves.has('leechseed')) || species.id === 'regigigas' ) return 'Leftovers'; - if (species.id === 'sylveon') return 'Pixie Plate'; + if (moves.has('hypervoice') && !types.includes('Normal')) return 'Throat Spray'; + if ( + role === 'Doubles Fast Attacker' && !counter.get('recoil') && + species.baseStats.hp + species.baseStats.def + species.baseStats.spd <= 230 + ) return 'Focus Sash'; if ( (offensiveRole || (role === 'Tera Blast user' && (species.baseStats.spe >= 80 || moves.has('trickroom')))) && !moves.has('fakeout') && @@ -1313,7 +1307,7 @@ export class RandomTeams { ) ? 'Booster Energy' : 'Life Orb'; } if (isLead && (species.id === 'glimmora' || - (['Doubles Fast Attacker', 'Doubles Wallbreaker', 'Offensive Protect'].includes(role) && + (['Doubles Wallbreaker', 'Offensive Protect'].includes(role) && species.baseStats.hp + species.baseStats.def + species.baseStats.spd <= 230)) ) return 'Focus Sash'; if ( @@ -1595,6 +1589,7 @@ export class RandomTeams { return { name: species.baseSpecies, species: forme, + speciesId: species.id, gender: species.baseSpecies === 'Greninja' ? 'M' : (species.gender || (this.random(2) ? 'F' : 'M')), shiny: this.randomChance(1, 1024), level, @@ -1643,6 +1638,79 @@ export class RandomTeams { return [pokemonPool, baseSpeciesPool]; } + /** + * Checks if the new species is compatible with the other mons currently on the team. + */ + getPokemonCompatibility( + species: Species, + pokemon: RandomTeamsTypes.RandomSet[], + isDoubles = false + ): boolean { + const webSetters = [ + 'ariados', 'smeargle', 'masquerain', 'kricketune', 'leavanny', 'galvantula', 'vikavolt', 'ribombee', 'araquanid', 'spidops', + ]; + const screenSetters = ['meowstic', 'grimmsnarl', 'ninetalesalola', 'abomasnow']; + + const doublesWebSetters = ['ariados', 'kricketune', 'leavanny', 'galvantula', 'vikavolt', 'araquanid', 'spidops']; + const doublesScreenSetters = ['meowstic', 'klefki', 'grimmsnarl', 'ninetalesalola', 'abomasnow']; + + const sunSetters = ['ninetales', 'torkoal', 'groudon', 'koraidon']; + const rainSetters = ['politoed', 'pelipper', 'kyogre']; + const sandSetters = ['tyranitar', 'hippowdon']; + const snowSetters = ['ninetalesalola', 'abomasnow']; + + const incompatiblePokemon = [ + // These Pokemon with support roles are considered too similar to each other. + ['blissey', 'chansey'], + ['illumise', 'volbeat'], + + // These combinations are prevented to avoid double webs or screens. + [webSetters, webSetters], + [screenSetters, screenSetters], + + // These Pokemon are incompatible because the presence of one actively harms the other. + // Prevent Dry Skin + sun setting ability + ['toxicroak', sunSetters], + ]; + + const doublesIncompatiblePokemon = [ + // These Pokemon with support roles are considered too similar to each other. + ['illumise', 'volbeat'], + [['minun', 'plusle', 'pachirisu', 'raichu'], ['minun', 'plusle', 'pachirisu', 'raichu']], + + // These combinations are prevented to avoid double webs or screens. + [doublesWebSetters, doublesWebSetters], + [doublesScreenSetters, doublesScreenSetters], + + // These Pokemon are incompatible because the presence of one actively harms the other. + // Prevent Dry Skin + sun setting ability + ['toxicroak', sunSetters], + + // Prevent conflicting weather abilities from generating together + [sunSetters, [...rainSetters, ...sandSetters, ...snowSetters]], + [rainSetters, [...sandSetters, ...snowSetters]], + [sandSetters, snowSetters], + + // Prevent conflicting terrain abilities from generating together + [['pincurchin', 'miraidon'], ['indeedee', 'indeedeef', 'rillaboom']], + ['rillaboom', ['indeedee', 'indeedeef']], + ]; + + const incompatibilityList = isDoubles ? doublesIncompatiblePokemon : incompatiblePokemon; + for (const pair of incompatibilityList) { + const monsArrayA = (Array.isArray(pair[0])) ? pair[0] : [pair[0]]; + const monsArrayB = (Array.isArray(pair[1])) ? pair[1] : [pair[1]]; + if (monsArrayB.includes(species.id)) { + if (pokemon.some(m => monsArrayA.includes(m.speciesId!))) return false; + } + if (monsArrayA.includes(species.id)) { + if (pokemon.some(m => monsArrayB.includes(m.speciesId!))) return false; + } + } + + return true; + } + randomSets: { [species: string]: RandomTeamsTypes.RandomSpeciesData } = require('./sets.json'); randomDoublesSets: { [species: string]: RandomTeamsTypes.RandomSpeciesData } = require('./doubles-sets.json'); @@ -1750,6 +1818,9 @@ export class RandomTeams { if (!this.adjustLevel && (this.getLevel(species, isDoubles) === 100) && numMaxLevelPokemon >= limitFactor) { continue; } + + // Check compatibility with team + if (!this.getPokemonCompatibility(species, pokemon, isDoubles)) continue; } // Limit three of any type combination in Monotype @@ -1849,6 +1920,216 @@ export class RandomTeams { return pokemon; } + randomGodlyGiftTeam() { + 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 = {}; + let numMaxLevelPokemon = 0; + + const pokemonList = isDoubles ? Object.keys(this.randomDoublesSets) : Object.keys(this.randomSets); + // God Pokemon are those with at least 510 BST, not including HP + const godPokemonList = pokemonList.filter(poke => { + const baseStats = this.dex.species.get(poke).baseStats; + return baseStats.atk + baseStats.def + baseStats.spa + baseStats.spd + baseStats.spe >= 510; + }); + const [pokemonPool, baseSpeciesPool] = this.getPokemonPool(type, pokemon, isMonotype, pokemonList); + const [godPokemonPool, godBaseSpeciesPool] = this.getPokemonPool(type, pokemon, isMonotype, godPokemonList); + + while (baseSpeciesPool.length && pokemon.length < this.maxTeamSize) { + let baseSpecies, species; + // Generate a God Pokemon in the lead slot + if (pokemon.length === 0) { + baseSpecies = this.sampleNoReplace(godBaseSpeciesPool); + species = this.dex.species.get(this.sample(godPokemonPool[baseSpecies])); + } else { + baseSpecies = this.sampleNoReplace(baseSpeciesPool); + species = this.dex.species.get(this.sample(pokemonPool[baseSpecies])); + + // Ensure that the species isn't harmed by Godly Gift stat passing + if (pokemon.length < 6) { + const s: StatID[] = ["hp", "atk", "def", "spa", "spd", "spe"]; + const passedStatName = s[pokemon.length]; + const passedStat = (this.dex.species.get(pokemon[0].speciesId).baseStats[passedStatName]); + // If Deoxys-Attack is the god, just make sure the def/spd stat is <= 50 + if (Math.max(passedStat, 50) < species.baseStats[passedStatName]) continue; + } + } + 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 === 'Zoroark' && pokemon.length >= (this.maxTeamSize - 1)) continue; + + const types = species.types; + const typeCombo = types.slice().sort().join(); + const weakToFreezeDry = ( + this.dex.getEffectiveness('Ice', species) > 0 || + (this.dex.getEffectiveness('Ice', species) > -2 && types.includes('Water')) + ); + // Dynamically scale limits for different team sizes. The default and minimum value is 1. + const limitFactor = Math.round(this.maxTeamSize / 6) || 1; + + if (!isMonotype && !this.forceMonotype) { + let skip = false; + + // Limit two of any type + for (const typeName of types) { + if (typeCount[typeName] >= 2 * limitFactor) { + skip = true; + break; + } + } + if (skip) continue; + + // Limit three weak to any type, and one double weak to any type + for (const typeName of this.dex.types.names()) { + // it's weak to the type + if (this.dex.getEffectiveness(typeName, species) > 0) { + if (!typeWeaknesses[typeName]) typeWeaknesses[typeName] = 0; + if (typeWeaknesses[typeName] >= 3 * limitFactor) { + skip = true; + break; + } + } + if (this.dex.getEffectiveness(typeName, species) > 1) { + if (!typeDoubleWeaknesses[typeName]) typeDoubleWeaknesses[typeName] = 0; + if (typeDoubleWeaknesses[typeName] >= limitFactor) { + skip = true; + break; + } + } + } + if (skip) continue; + + // Count Dry Skin/Fluffy as Fire weaknesses + if ( + this.dex.getEffectiveness('Fire', species) === 0 && + Object.values(species.abilities).filter(a => ['Dry Skin', 'Fluffy'].includes(a)).length + ) { + if (!typeWeaknesses['Fire']) typeWeaknesses['Fire'] = 0; + if (typeWeaknesses['Fire'] >= 3 * limitFactor) continue; + } + + // Limit four weak to Freeze-Dry + if (weakToFreezeDry) { + if (!typeWeaknesses['Freeze-Dry']) typeWeaknesses['Freeze-Dry'] = 0; + if (typeWeaknesses['Freeze-Dry'] >= 4 * limitFactor) continue; + } + + // Limit one level 100 Pokemon + if (!this.adjustLevel && (this.getLevel(species, isDoubles) === 100) && numMaxLevelPokemon >= limitFactor) { + continue; + } + + // Check compatibility with team + if (!this.getPokemonCompatibility(species, pokemon, isDoubles)) continue; + } + + // 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; + + const set = this.randomSet(species, teamDetails, false, isDoubles); + pokemon.push(set); + + // Don't bother tracking details for the last Pokemon + if (pokemon.length === this.maxTeamSize) break; + + // Now that our Pokemon has passed all checks, we can increment our counters + baseFormes[species.baseSpecies] = 1; + + // Increment type counters + for (const typeName of types) { + if (typeName in typeCount) { + typeCount[typeName]++; + } else { + typeCount[typeName] = 1; + } + } + if (typeCombo in typeComboCount) { + typeComboCount[typeCombo]++; + } else { + typeComboCount[typeCombo] = 1; + } + + // Increment weakness counter + for (const typeName of this.dex.types.names()) { + // it's weak to the type + if (this.dex.getEffectiveness(typeName, species) > 0) { + typeWeaknesses[typeName]++; + } + if (this.dex.getEffectiveness(typeName, species) > 1) { + typeDoubleWeaknesses[typeName]++; + } + } + // 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' || ['ogerpon', 'ogerponhearthflame', 'terapagos'].includes(species.id)) { + 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; + } + randomCCTeam(): RandomTeamsTypes.RandomSet[] { this.enforceNoDirectCustomBanlistChanges(); @@ -3020,7 +3301,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 +3319,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 +3411,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 +3458,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 +3469,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 +3529,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 +3539,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/gen9regeneration/random-sets.json b/data/random-battles/gen9regeneration/random-sets.json new file mode 100644 index 0000000000..65e38f561d --- /dev/null +++ b/data/random-battles/gen9regeneration/random-sets.json @@ -0,0 +1,1093 @@ +{ + "venusaur": { + "level": 84, + "sets": [ + { + "role": "Staller", + "movepool": ["gigadrain", "leechseed", "sleeppowder", "dazzlinggleam", "substitute"], + "abilities": ["Misty Surge"] + }, + { + "role": "Bulky Attacker", + "movepool": ["psychic", "energyball", "knockoff", "sleeppowder", "dazzlinggleam", "synthesis"], + "abilities": ["Misty Surge"] + } + ] + }, + "charizard": { + "level": 83, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["suckerpunch", "smokytorment", "earthquake", "flareblitz", "swordsdance"], + "abilities": ["Levitate"] + }, + { + "role": "Bulky Attacker", + "movepool": ["ceaselessedge", "flareblitz", "earthquake", "roost", "willowisp"], + "abilities": ["Levitate"] + } + ] + }, + "blastoise": { + "level": 84, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["hiddenpower", "rapidspin", "roar", "powerwash", "toxic", "thunderbolt", "thunderwave"], + "abilities": ["Motor Drive"], + "teraTypes": ["Ice"] + }, + { + "role": "Staller", + "movepool": ["haze", "hiddenpower", "protect", "powerwash", "scald", "toxic"], + "abilities": ["Motor Drive"], + "teraTypes": ["Ice"] + } + ] + }, + "butterfree": { + "level": 84, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["airslash", "powdergale", "quiverdance", "sleeppowder", "hiddenpower", "strengthsap"], + "abilities": ["Tinted Lens", "Multiscale"], + "teraTypes": ["Ice"] + } + ] + }, + "beedrill": { + "level": 85, + "sets": [ + { + "role": "Fast Support", + "movepool": ["stickyweb", "knockoff", "poisonjab", "toxicspikes", "uturn"], + "abilities": ["Speed Boost"] + }, + { + "role": "Setup Sweeper", + "movepool": ["swords dance", "knockoff", "poisonjab", "xscissor", "closecombat", "protect"], + "abilities": ["Speed Boost"] + } + ] + }, + "pidgeot": { + "level": 84, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["bravebird", "closecombat", "roost", "uturn"], + "abilities": ["wingsofvictory"] + } + ] + }, + "raticate": { + "level": 84, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["crunch", "facade", "gunkshot", "pestspread", "protect", "closecombat", "uturn"], + "abilities": ["Guts"] + }, + { + "role": "Fast Attacker", + "movepool": ["crunch", "doubleedge", "gunkshot", "pestspread", "closecombat", "uturn"], + "abilities": ["Hustle", "Poison Touch"] + } + ] + }, + "fearow": { + "level": 88, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["doubleedge", "drillpeck", "drillrun", "return", "uturn"], + "abilities": ["Sniper"] + }, + { + "role": "Setup Sweeper", + "movepool": ["drillpeck", "drillrun", "focusenergy", "return"], + "abilities": ["Sniper"] + } + ] + }, + "arbok": { + "level": 90, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["aquatail", "coil", "earthquake", "gunkshot", "suckerpunch", "trailblaze"], + "abilities": ["Intimidate"] + + }, + { + "role": "Bulky Setup", + "movepool": ["coil", "earthquake", "gunkshot", "rest"], + "abilities": ["Shed Skin"] + } + ] + }, + "pikachu": { + "level": 93, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["extremespeed", "grassknot", "hiddenpower", "knockoff", "surf", "voltswitch", "volttackle"], + "abilities": ["Lightning Rod"], + "teraTypes": ["Ice"] + } + ] + }, + "raichu": { + "level": 88, + "sets": [ + { + "role": "Fast Support", + "movepool": ["encore", "hiddenpower", "knockoff", "nastyplot", "nuzzle", "thunderbolt", "voltswitch", "alluringvoice"], + "abilities": ["Lightning Rod"], + "preferredTypes": ["Ice"], + "teraTypes": ["Ice"] + }, + { + "role": "Fast Attacker", + "movepool": ["focusblast", "grassknot", "nastyplot", "surf", "thunderbolt", "voltswitch", "alluringvoice"], + "abilities": ["Lightning Rod"], + "teraTypes": ["Ice"] + } + ] + }, + "sandslash": { + "level": 90, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["earthquake", "knockoff", "rapidspin", "stealthrock", "stoneedge", "swordsdance", "toxic"], + "abilities": ["Sand Rush"] + } + ] + }, + "nidoqueen": { + "level": 83, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["earthpower", "fireblast", "icebeam", "poisonjab", "sludgewave", "stealthrock", "toxicspikes"], + "abilities": ["Sheer Force"], + "preferredTypes": ["Ice"] + }, + { + "role": "Wallbreaker", + "movepool": ["earthpower", "poisonjab", "stealthrock", "toxicspikes", "moonlight"], + "abilities": ["Sheer Force", "Natural Cure", "Poison Point"], + "preferredTypes": ["Ice"] + } + ] + }, + "nidoking": { + "level": 82, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["earthpower", "fireblast", "icebeam", "poisonjab", "sludgewave", "substitute", "throatchop"], + "abilities": ["Sheer Force"], + "preferredTypes": ["Ice"] + }, + { + "role": "Fast Attacker", + "movepool": ["poisonjab", "earthquake", "headsmash", "superpower", "barbbarrage"], + "abilities": ["patriarch"] + } + ] + }, + "clefable": { + "level": 83, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["aromatherapy", "knockoff", "moonblast", "softboiled", "stealthrock", "thunderwave"], + "abilities": ["Magic Guard", "Unaware"] + }, + { + "role": "Bulky Setup", + "movepool": ["calmmind", "fireblast", "moonblast", "softboiled"], + "abilities": ["Magic Guard", "Unaware"] + } + ] + }, + "ninetales": { + "level": 84, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["fireblast", "hiddenpower", "nastyplot", "solarbeam"], + "abilities": ["Drought"], + "teraTypes": ["Ice"] + }, + { + "role": "Bulky Setup", + "movepool": ["fireblast", "nastyplot", "solarbeam", "substitute", "willowisp"], + "abilities": ["Drought"], + "preferredTypes": ["Grass"] + } + ] + }, + "wigglytuff": { + "level": 85, + "sets": [ + { + "role": "Fast Support", + "movepool": ["dazzlinggleam", "rapid spin", "healbell", "knockoff", "protect", "stealthrock", "thunderwave", "wish", "encore"], + "abilities": ["Ballooning"] + } + ] + }, + "vileplume": { + "level": 87, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["aromatherapy", "gigadrain", "hiddenpower", "sleeppowder", "sludgebomb", "strengthsap"], + "abilities": ["Effect Spore"], + "teraTypes": ["Ground"] + } + ] + }, + "parasect": { + "level": 99, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["aromatherapy", "knockoff", "leechlife", "seedbomb", "spore", "stunspore", "swordsdance"], + "abilities": ["Dry Skin"], + "preferredTypes": ["Bug"] + } + ] + }, + "venomoth": { + "level": 82, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["bugbuzz", "quiverdance", "sleeppowder", "sludgebomb"], + "abilities": ["Tinted Lens"] + } + ] + }, + "dugtrio": { + "level": 84, + "sets": [ + { + "role": "Fast Support", + "movepool": ["earthquake", "honeclaws", "stealthrock", "stoneedge", "suckerpunch"], + "abilities": ["Arena Trap"] + }, + { + "role": "Wallbreaker", + "movepool": ["doubleedge", "earthquake", "stoneedge", "suckerpunch"], + "abilities": ["Arena Trap"] + } + ] + }, + "persian": { + "level": 93, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["doubleedge", "knockoff", "return", "seedbomb", "uturn"], + "abilities": ["Limber"] + }, + { + "role": "Wallbreaker", + "movepool": ["doubleedge", "fakeout", "knockoff", "return", "uturn"], + "abilities": ["Technician"] + }, + { + "role": "Setup Sweeper", + "movepool": ["hiddenpower", "hypervoice", "nastyplot", "shadowball"], + "abilities": ["Technician"], + "teraTypes": ["Fighting"] + } + ] + }, + "golduck": { + "level": 93, + "sets": [ + { + "role": "Bulky Setup", + "movepool": ["calmmind", "encore", "focusblast", "icebeam", "scald", "substitute"], + "abilities": ["Cloud Nine", "Swift Swim"], + "preferredTypes": ["Ice"] + }, + { + "role": "Fast Attacker", + "movepool": ["calmmind", "encore", "focusblast", "hydropump", "icebeam"], + "abilities": ["Cloud Nine", "Swift Swim"], + "preferredTypes": ["Ice"] + } + ] + }, + "primeape": { + "level": 89, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["closecombat", "earthquake", "gunkshot", "stoneedge", "throatchop", "uturn"], + "abilities": ["Defiant"] + }, + { + "role": "Setup Sweeper", + "movepool": ["closecombat", "earthquake", "gunkshot", "honeclaws", "stoneedge", "throatchop"], + "abilities": ["Defiant"], + "preferredTypes": ["Rock"] + } + ] + }, + "arcanine": { + "level": 84, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["closecombat", "extremespeed", "flareblitz", "morningsun", "roar", "toxic", "wildcharge", "willowisp"], + "abilities": ["Intimidate"] + }, + { + "role": "Fast Attacker", + "movepool": ["closecombat", "extremespeed", "flareblitz", "morningsun", "wildcharge"], + "abilities": ["Intimidate"], + "preferredTypes": ["Fighting"] + } + ] + }, + "poliwrath": { + "level": 88, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Close Combat", "Knock Off", "Liquidation", "Rain Dance"], + "abilities": ["Swift Swim"] + }, + { + "role": "AV Pivot", + "movepool": ["Circle Throw", "Close Combat", "Knock Off", "Liquidation"], + "abilities": ["Water Absorb"] + }, + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Drain Punch", "Ice Punch", "Knock Off", "Liquidation", "Poison Jab"], + "abilities": ["Water Absorb"] + } + ] + }, + "alakazam": { + "level": 82, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["dazzling gleam", "psychic", "psyshock", "shadowball"], + "abilities": ["Galaxy Brain", "Trace"] + }, + { + "role": "Setup Sweeper", + "movepool": ["calmmind", "encore", "dazzling gleam", "psychic", "psyshock", "brainwave", "shadowball", "substitute"], + "abilities": ["Galaxy Brain", "Trace"] + } + ] + }, + "machamp": { + "level": 84, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["bulkup", "bulletpunch", "dynamicpunch", "knockoff", "stoneedge"], + "abilities": ["No Guard"], + "preferredTypes": ["Dark"] + }, + { + "role": "AV Pivot", + "movepool": ["bulletpunch", "dynamicpunch", "knockoff", "stoneedge"], + "abilities": ["No Guard"] + }, + { + "role": "Wallbreaker", + "movepool": ["bulletpunch", "closecombat", "facade", "knockoff"], + "abilities": ["Guts"], + "preferredTypes": ["Dark"] + } + ] + }, + "victreebel": { + "level": 90, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["poisonjab", "powerwhip", "suckerpunch", "swordsdance"], + "abilities": ["Chlorophyll"] + }, + { + "role": "Wallbreaker", + "movepool": ["hiddenpower", "knockoff", "powerwhip", "sleeppowder", "sludgebomb", "strengthsap", "suckerpunch"], + "abilities": ["Chlorophyll"], + "teraTypes": ["Ground"] + }, + { + "role": "Fast Attacker", + "movepool": ["powerwhip", "sludgebomb", "sunnyday", "weatherball"], + "abilities": ["Chlorophyll"] + } + ] + }, + "tentacruel": { + "level": 83, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["haze", "knockoff", "rapidspin", "sludgebomb", "toxicspikes", "flip turn", "protect"], + "abilities": ["Tropical Current"] + } + ] + }, + "golem": { + "level": 86, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["earthquake", "explosion", "stealthrock", "stoneedge", "suckerpunch", "toxic"], + "abilities": ["Sturdy"] + }, + { + "role": "Bulky Setup", + "movepool": ["earthquake", "explosion", "rockpolish", "stoneedge", "suckerpunch"], + "abilities": ["Sturdy"] + } + ] + }, + "rapidash": { + "level": 87, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["flareblitz", "highhorsepower", "morningsun", "wildcharge", "willowisp"], + "abilities": ["Flame Body", "Flash Fire"] + }, + { + "role": "Wallbreaker", + "movepool": ["flareblitz", "highhorsepower", "megahorn", "morningsun", "wildcharge"], + "abilities": ["Flash Fire"] + } + ] + }, + "slowbro": { + "level": 85, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["Calm Mind", "Psychic Noise", "Psyshock", "Scald", "Slack Off", "Thunder Wave"], + "abilities": ["Regenerator"] + }, + { + "role": "Bulky Support", + "movepool": ["Body Press", "Fire Blast", "Future Sight", "Ice Beam", "Psychic Noise", "Scald", "Teleport"], + "abilities": ["Regenerator"] + }, + { + "role": "Bulky Setup", + "movepool": ["Body Press", "Iron Defense", "Scald", "Slack Off"], + "abilities": ["Regenerator"] + } + ] + }, + "farfetchd": { + "level": 85, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["knockoff", "closecombat", "return", "swordsdance", "uturn"], + "abilities": ["Hustle", "Scrappy"] + } + ] + }, + "dodrio": { + "level": 82, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["bravebird", "highjumpkick", "knockoff", "earthquake", "swordsdance", "uturn"], + "abilities": ["ofafeather"], + "preferredTypes": ["Flying"] + } + ] + }, + "dewgong": { + "level": 96, + "sets": [ + { + "role": "Staller", + "movepool": ["icebeam", "protect", "surf", "toxic"], + "abilities": ["Thick Fat"] + }, + { + "role": "Bulky Support", + "movepool": ["encore", "icebeam", "surf", "toxic"], + "abilities": ["Thick Fat"] + } + ] + }, + "muk": { + "level": 88, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["brickbreak", "curse", "gunkshot", "haze", "icepunch", "poisonjab", "shadowsneak"], + "abilities": ["Poison Touch"], + "preferredTypes": ["Fighting"] + }, + { + "role": "AV Pivot", + "movepool": ["Drain Punch", "Gunk Shot", "Ice Punch", "Knock Off", "Poison Jab", "Shadow Sneak"], + "abilities": ["Poison Touch"] + } + + ] + }, + "cloyster": { + "level": 84, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["curse", "splashback", "bulletpunch", "iciclecrash", "drillrun"], + "abilities": ["Regenerator"] + }, + { + "role": "Bulky Support", + "movepool": ["splashback", "bulletpunch", "rapidspin", "toxic", "spikes", "toxicspikes", "teleport"], + "abilities": ["Regenerator"] + } + ] + }, + "gengar": { + "level": 84, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["shadowball", "icebeam", "illwind", "dazzlinggleam", "hiddenpower"], + "abilities": ["blackout"], + "teraTypes": ["Fighting"] + }, + { + "role": "Fast Support", + "movepool": ["willowisp", "thunderwave", "hex", "illwind", "encore", "taunt", "destinybond"], + "abilities": ["blackout"] + } + ] + }, + "hypno": { + "level": 97, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["focusblast", "foulplay", "protect", "psychic", "thunderwave", "toxic", "wish"], + "abilities": ["Insomnia"] + }, + { + "role": "Staller", + "movepool": ["protect", "seismictoss", "toxic", "wish"], + "abilities": ["Insomnia"] + } + ] + }, + "kingler": { + "level": 87, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["agility", "knockoff", "liquidation", "rockslide", "superpower", "swordsdance", "xscissor"], + "abilities": ["Sheer Force"] + } + ] + }, + "electrode": { + "level": 89, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["foulplay", "hiddenpower", "signalbeam", "taunt", "thunderbolt", "voltswitch"], + "abilities": ["Aftermath", "Static"], + "preferredTypes": ["Ice"], + "teraTypes": ["Ice"] + }, + { + "role": "Fast Support", + "movepool": ["hiddenpower", "lightscreen", "reflect", "thunderbolt", "thunderwave", "toxic", "voltswitch"], + "abilities": ["Aftermath", "Static"], + "teraTypes": ["Ice"] + } + ] + }, + "exeggutor": { + "level": 90, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Leech Seed", "Psychic", "Psychic Noise", "Sleep Powder", "Sludge Bomb", "Substitute"], + "abilities": ["Harvest"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Leech Seed", "Protect", "Psychic Noise", "Substitute"], + "abilities": ["Harvest"] + }, + { + "role": "Bulky Setup", + "movepool": ["Calm Mind", "Giga Drain", "Psychic", "Psyshock", "Sleep Powder", "hiddenpower", "Substitute"], + "abilities": ["Harvest"], + "teraTypes": ["Fighting"] + } + ] + }, + "marowak": { + "level": 84, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["earthquake", "knockoff", "closecombat", "swordsdance", "vengefulbone", "stealthrock", "stoneedge"], + "abilities": ["Justified"] + } + ] + }, + "hitmonlee": { + "level": 86, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["highjumpkick", "knockoff", "machpunch", "poisonjab", "rapidspin", "stoneedge"], + "abilities": ["Reckless"], + "preferredTypes": ["Dark"] + }, + { + "role": "Setup Sweeper", + "movepool": ["closecombat", "curse", "knockoff", "poisonjab", "stoneedge"], + "abilities": ["Unburden"], + "preferredTypes": ["Dark"] + } + ] + }, + "hitmonchan": { + "level": 87, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["Drain Punch", "Ice Punch", "Knock Off", "Mach Punch", "Rapid Spin", "Swords Dance"], + "abilities": ["Iron Fist"] + }, + { + "role": "Bulky Setup", + "movepool": ["Bulk Up", "Drain Punch", "Knock Off", "Poison Jab", "Rapid Spin"], + "abilities": ["Iron Fist"] + }, + { + "role": "Bulky Support", + "movepool": ["Drain Punch", "Encore", "Knock Off", "Poison Jab", "Rapid Spin", "Taunt"], + "abilities": ["Iron Fist"] + } + ] + }, + "weezing": { + "level": 87, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["fireblast", "painsplit", "sludgebomb", "toxicspikes", "willowisp"], + "abilities": ["Levitate"] + } + ] + }, + "rhydon": { + "level": 85, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["earthquake", "megahorn", "stealthrock", "stoneedge", "swordsdance", "toxic"], + "abilities": ["Lightning Rod"] + } + ] + }, + "chansey": { + "level": 85, + "sets": [ + { + "role": "Staller", + "movepool": ["aromatherapy", "seismictoss", "softboiled", "stealthrock", "thunderwave", "toxic", "wish"], + "abilities": ["Natural Cure"] + } + ] + }, + "kangaskhan": { + "level": 82, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["familyonslaught", "drainpunch", "earthquake", "u-turn", "suckerpunch", "dragonclaw"], + "abilities": ["Skill Link"] + }, + { + "role": "AV Pivot", + "movepool": ["familyonslaught", "drainpunch", "earthquake", "u-turn", "suckerpunch", "dragonclaw"], + "abilities": ["Skill Link"] + }, + { + "role": "Setup Sweeper", + "movepool": ["dragondance", "familyonslaught", "drainpunch", "earthquake", "dragonclaw"], + "abilities": ["Skill Link"] + } + ] + }, + "seaking": { + "level": 95, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["drillrun", "icebeam", "knockoff", "megahorn", "waterfall"], + "abilities": ["Lightning Rod"], + "preferredTypes": ["Dark"] + }, + { + "role": "Setup Sweeper", + "movepool": ["drillrun", "icebeam", "knockoff", "megahorn", "raindance", "waterfall"], + "abilities": ["Swift Swim"], + "preferredTypes": ["Dark"] + } + ] + }, + "starmie": { + "level": 84, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["hydropump", "icebeam", "psyshock", "flipturn", "thunderbolt"], + "abilities": ["Analytic", "Natural Cure"] + }, + { + "role": "Bulky Support", + "movepool": ["psyshock", "rapidspin", "recover", "scald", "flipturn", "thunderwave", "toxic"], + "abilities": ["Natural Cure"] + } + ] + }, + "mrmime": { + "level": 90, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["dazzlinggleam", "encore", "focusblast", "healingwish", "psychic", "psyshock", "shadowball", "thunderbolt"], + "abilities": ["Filter"], + "preferredTypes": ["Fighting"] + }, + { + "role": "Setup Sweeper", + "movepool": ["dazzlinggleam", "encore", "focusblast", "nastyplot", "psychic", "psyshock"], + "abilities": ["Filter"] + } + ] + }, + "scyther": { + "level": 82, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["aerialace", "brickbreak", "knockoff", "pursuit", "uturn"], + "abilities": ["Technician"] + }, + { + "role": "Setup Sweeper", + "movepool": ["aerialace", "brickbreak", "bugbite", "knockoff", "roost", "swordsdance"], + "abilities": ["Technician"] + } + ] + }, + "jynx": { + "level": 89, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["focusblast", "icebeam", "lovelykiss", "psychic", "psyshock", "trick"], + "abilities": ["Dry Skin"] + }, + { + "role": "Setup Sweeper", + "movepool": ["focusblast", "icebeam", "lovelykiss", "nastyplot", "psyshock"], + "abilities": ["Dry Skin"] + } + ] + }, + "pinsir": { + "level": 88, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["closecombat", "earthquake", "knockoff", "stealthrock", "stoneedge", "swordsdance", "xscissor"], + "abilities": ["Moxie"], + "preferredTypes": ["Ground"] + } + ] + }, + "tauros": { + "level": 84, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["bodyslam", "headlongrush", "throatchop", "rockslide", "zenheadbutt", "escort"], + "abilities": ["Sheer Force"] + }, + { + "role": "Fast Attacker", + "movepool": ["doubleedge", "headlongrush", "stoneedge", "zenheadbutt", "escort"], + "abilities": ["Intimidate"] + } + ] + }, + "gyarados": { + "level": 82, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["dragondance", "crunch", "substitute", "liquidation"], + "abilities": ["Violent Abandon"] + } + ] + }, + "lapras": { + "level": 87, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["Freeze-Dry", "Hydro Pump", "Ice Beam", "Sparkling Aria", "escort"], + "abilities": ["Water Absorb"] + }, + { + "role": "Bulky Attacker", + "movepool": ["Freeze-Dry", "Wish", "Protect", "Sparkling Aria", "escort"], + "abilities": ["Water Absorb"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Dragon Dance", "Earthquake", "Icicle Spear", "Waterfall"], + "abilities": ["Water Absorb"] + } + ] + }, + "ditto": { + "level": 83, + "sets": [ + { + "role": "Fast Support", + "movepool": ["transform"], + "abilities": ["Imposter"] + } + ] + }, + "vaporeon": { + "level": 86, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["healbell", "icebeam", "protect", "scald", "wish", "slipwaway"], + "abilities": ["trace"] + }, + { + "role": "Wallbreaker", + "movepool": ["hydropump", "slipaway", "icebeam", "hiddenpower", "alluringvoice"], + "abilities": ["Protean"], + "teraTypes": ["Grass"] + } + ] + }, + "jolteon": { + "level": 81, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["hiddenpower", "shadowball", "thunderbolt", "voltswitch", "alluring voice"], + "abilities": ["Protean"], + "teraTypes": ["Ice"] + }, + { + "role": "Setup Sweeper", + "movepool": ["hiddenpower", "signalbeam", "thunderbolt", "voltswitch", "calmmind", "substitute"], + "abilities": ["Trace"], + "teraTypes": ["Ice"] + } + ] + }, + "flareon": { + "level": 88, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["superpower", "doubleedge", "suckerpunch", "flareblitz", "flareout"], + "abilities": ["Protean"] + } + ] + }, + "omastar": { + "level": 84, + "sets": [ + { + "role": "Setup Sweeper", + "movepool": ["hiddenpower", "hydropump", "icebeam", "shellsmash"], + "abilities": ["Shell Armor", "Swift Swim"], + "teraTypes": ["Grass"] + } + ] + }, + "kabutops": { + "level": 87, + "sets": [ + { + "role": "Fast Support", + "movepool": ["aquajet", "knockoff", "liquidation", "rapidspin", "stoneedge"], + "abilities": ["Battle Armor", "Swift Swim"] + }, + { + "role": "Setup Sweeper", + "movepool": ["aquajet", "knockoff", "liquidation", "stoneedge", "swordsdance"], + "abilities": ["Weak Armor"] + } + ] + }, + "aerodactyl": { + "level": 82, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["defog", "earthquake", "roost", "stealthrock", "stoneedge", "taunt", "toxic"], + "abilities": ["Unnerve"] + }, + { + "role": "Fast Support", + "movepool": ["aerialace", "aquatail", "defog", "earthquake", "roost", "stealthrock", "stoneedge"], + "abilities": ["Unnerve"], + "preferredTypes": ["Ground"] + } + ] + }, + "snorlax": { + "level": 83, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["bodyslam", "crunch", "curse", "earthquake", "rest", "return", "sleeptalk"], + "abilities": ["Thick Fat"] + }, + { + "role": "Bulky Setup", + "movepool": ["bodyslam", "crunch", "curse", "earthquake", "recycle", "return"], + "abilities": ["Gluttony"] + } + ] + }, + "articuno": { + "level": 85, + "sets": [ + { + "role": "Staller", + "movepool": ["freezedry", "roost", "substitute", "toxic"], + "abilities": ["Pressure"] + }, + { + "role": "Bulky Support", + "movepool": ["freezedry", "hurricane", "roost", "substitute", "toxic"], + "abilities": ["Pressure"] + } + ] + }, + "zapdos": { + "level": 79, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["defog", "discharge", "heatwave", "hiddenpower", "roost", "toxic", "uturn"], + "abilities": ["Static"], + "teraTypes": ["Ice"] + } + ] + }, + "moltres": { + "level": 82, + "sets": [ + { + "role": "Bulky Attacker", + "movepool": ["defog", "fireblast", "hurricane", "roost", "toxic", "uturn", "willowisp"], + "abilities": ["Flame Body"] + } + ] + }, + "dragonite": { + "level": 84, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Earthquake", "icespinner", "extremespeed", "uturn"], + "abilities": ["Lifeguard"] + }, + { + "role": "Bulky Attacker", + "movepool": ["dracometeor", "hurricane", "fireblast", "roost" , "uturn", "thunderbolt"], + "abilities": ["Lifeguard"] + } + + ] + }, + "mewtwo": { + "level": 72, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["aurasphere", "calmmind", "fireblast", "psystrike", "recover", "signalbeam"], + "abilities": ["Unnerve"] + } + ] + }, + "mew": { + "level": 80, + "sets": [ + { + "role": "Bulky Support", + "movepool": ["Encore", "Knock Off", "Psychic", "Psychic Noise", "Stealth Rock", "Toxic Spikes", "U-turn", "Will-O-Wisp", "roost"], + "abilities": ["Synchronize"] + }, + { + "role": "Setup Sweeper", + "movepool": ["Close Combat", "Knock Off", "Leech Life", "Psychic Fangs", "Swords Dance"], + "abilities": ["Synchronize"] + }, + { + "role": "Fast Bulky Setup", + "movepool": ["Aura Sphere", "Bug Buzz", "Dark Pulse", "Earth Power", "Fire Blast", "Hydro Pump", "Nasty Plot", "Psychic", "Psyshock"], + "abilities": ["Synchronize"] + } + ] + }, + "porygon": { + "level": 100, + "sets": [ + { + "role": "Wallbreaker", + "movepool": ["triattack", "shadowball", "hiddenpower", "hyperbeam", "trick"], + "abilities": ["Download"], + "teraTypes": ["Fighting"] + } + ] + }, + "magneton": { + "level": 89, + "sets": [ + { + "role": "Fast Attacker", + "movepool": ["Flash Cannon", "Thunderbolt", "Volt Switch", "hiddenpower"], + "abilities": ["Analytic", "Magnet Pull"], + "teraTypes": ["Ground"] + } + ] + } +} diff --git a/data/random-battles/scootopiav2/teams.ts b/data/random-battles/gen9regeneration/teams.ts similarity index 72% rename from data/random-battles/scootopiav2/teams.ts rename to data/random-battles/gen9regeneration/teams.ts index c03dcede03..fa44c2544f 100644 --- a/data/random-battles/scootopiav2/teams.ts +++ b/data/random-battles/gen9regeneration/teams.ts @@ -1,1001 +1,1149 @@ -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', +]; +const SPEED_CONTROL = [ + 'electroweb', 'glare', 'icywind', 'lowsweep', 'quash', 'stringshot', 'tailwind', 'thunderwave', 'trickroom', +]; +// Hazard-setting moves +const HAZARDS = [ + 'spikes', 'stealthrock', 'stickyweb', 'toxicspikes', +]; +// 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'], + ['leechseed', 'protect'], + ['leechseed', 'substitute'], + ['leechseed', 'burningbulwark'], +]; + +/** 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 RandomRGTeams 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 && movePool.length >= this.maxMoveCount + 2) { + if (movePool.includes('reflect')) this.fastPop(movePool, movePool.indexOf('reflect')); + if (movePool.includes('lightscreen')) this.fastPop(movePool, movePool.indexOf('lightscreen')); + if (moves.size + movePool.length <= this.maxMoveCount) return; + } + if (teamDetails.stickyWeb) { + if (movePool.includes('stickyweb')) this.fastPop(movePool, movePool.indexOf('stickyweb')); + if (moves.size + movePool.length <= this.maxMoveCount) return; + } + if (teamDetails.stealthRock) { + if (movePool.includes('stealthrock')) this.fastPop(movePool, movePool.indexOf('stealthrock')); + if (moves.size + movePool.length <= this.maxMoveCount) return; + } + if (teamDetails.defog || teamDetails.rapidSpin) { + if (movePool.includes('defog')) this.fastPop(movePool, movePool.indexOf('defog')); + if (movePool.includes('rapidspin')) this.fastPop(movePool, movePool.indexOf('rapidspin')); + if (moves.size + movePool.length <= this.maxMoveCount) return; + } + if (teamDetails.toxicSpikes) { + if (movePool.includes('toxicspikes')) this.fastPop(movePool, movePool.indexOf('toxicspikes')); + if (moves.size + movePool.length <= this.maxMoveCount) return; + } + if (teamDetails.spikes && teamDetails.spikes >= 2) { + if (movePool.includes('spikes')) this.fastPop(movePool, movePool.indexOf('spikes')); + if (moves.size + movePool.length <= this.maxMoveCount) return; + } + 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], + [PROTECT_MOVES, PROTECT_MOVES], + ['rockslide', 'stoneedge'], + [SETUP, ['fakeout', 'helpinghand']], + [PROTECT_MOVES, 'wideguard'], + [['fierydance', 'fireblast'], 'heatwave'], + ['dazzlinggleam', ['fleurcannon', 'moonblast']], + ['poisongas', ['toxicspikes', 'willowisp']], + [RECOVERY_MOVES, 'healpulse'], + ['lifedew', 'healpulse'], + ['haze', 'icywind'], + [['hydropump', 'muddywater'], ['muddywater', 'scald']], + ['disable', 'encore'], + ['freezedry', 'icebeam'], + ['energyball', 'leafstorm'], + ['wildcharge', 'thunderbolt'], + ['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'], + + // These attacks are redundant with each other + ['surf', 'hydropump'], + ['liquidation', 'wavecrash'], + ['aquajet', 'flipturn'], + ['gigadrain', 'leafstorm'], + ['powerwhip', 'hornleech'], + [['airslash', 'bravebird', 'hurricane'], ['airslash', 'bravebird', 'hurricane']], + ['knockoff', 'foulplay'], + ['throatchop', ['crunch', 'lashout']], + ['doubleedge', ['bodyslam', 'headbutt']], + ['fireblast', ['fierydance', 'flamethrower']], + ['lavaplume', 'magmastorm'], + ['thunderpunch', 'wildcharge'], + [['thunderbolt', 'discharge', 'thunder'], ['thunderbolt', 'discharge', 'thunder']], + ['gunkshot', ['direclaw', 'poisonjab', 'sludgebomb']], + ['aurasphere', 'focusblast'], + ['closecombat', 'drainpunch'], + ['bugbite', 'pounce'], + [['dragonpulse', 'spacialrend'], 'dracometeor'], + ['heavyslam', 'flashcannon'], + ['alluringvoice', 'dazzlinggleam'], + + // These status moves are redundant with each other + ['taunt', 'disable'], + [['thunderwave', 'toxic'], ['thunderwave', 'willowisp']], + [['thunderwave', 'toxic', 'willowisp'], 'toxicspikes'], + ]; + + 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', 'strengthsap'], '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 + } + + 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. + + // PMCM hardcodes (reserve these to when absolutely necessary, let the script do most of the work) + // forces Splash on Chi-Yu's moveset, since it uses Z-Splash + if (species.id === 'chiyu') { + if (movePool.includes('splash')) { + counter = this.addMove('splash', moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + } + // enforces both primary stabs on Infernape + if (species.id === 'infernape' && movePool.includes('mindblown')) { + counter = this.addMove('mindblown', moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + counter = this.addMove('alloutassault', moves, types, abilities, teamDetails, species, isLead, isDoubles, + movePool, teraType, role); + } + + // 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 getAbility( + types: string[], + moves: Set, + abilities: string[], + counter: MoveCounter, + teamDetails: RandomTeamsTypes.TeamDetails, + species: Species, + isLead: boolean, + isDoubles: boolean, + teraType: string, + role: RandomTeamsTypes.Role, + ): string { + if (abilities.length <= 1) return abilities[0]; + + // 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 === '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'; + if (abilities.includes('Slush Rush') && moves.has('snowscape')) return 'Slush Rush'; + if (species.id === 'golduck' && teamDetails.rain) return 'Swift Swim'; + + const abilityAllowed: string[] = []; + // Obtain a list of abilities that are allowed (not culled) + for (const ability of abilities) { + if (!this.shouldCullAbility( + ability, types, moves, abilities, counter, teamDetails, species, isLead, isDoubles, teraType, role + )) { + abilityAllowed.push(ability); + } + } + + // Pick a random allowed ability + if (abilityAllowed.length >= 1) return this.sample(abilityAllowed); + + // If all abilities are rejected, prioritize weather abilities over non-weather abilities + if (!abilityAllowed.length) { + const weatherAbilities = abilities.filter( + a => ['Chlorophyll', 'Hydration', 'Sand Force', 'Sand Rush', 'Slush Rush', 'Solar Power', 'Swift Swim'].includes(a) + ); + if (weatherAbilities.length) return this.sample(weatherAbilities); + } + + // Pick a random ability + return this.sample(abilities); + } + + 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 (species.id === 'pikachu') return 'Light Ball'; + if (role === 'AV Pivot') return 'Assault Vest'; + if (species.id === 'marowak') return 'Thick Club'; + if (ability === 'Tropical Current') return 'Flame Orb'; + if (ability === 'Blackout') return 'Heavy-Duty Boots'; + if (species.id === 'gyarados') return 'Sitrus Berry'; + if (species.id === 'regieleki') return 'Magnet'; + if (types.includes('Normal') && moves.has('doubleedge') && moves.has('fakeout')) return 'Silk Scarf'; + if ( + species.id === 'froslass' || moves.has('populationbomb') || + (ability === 'Hustle' && counter.get('setup') && !isDoubles && this.randomChance(1, 2)) + ) return 'Wide Lens'; + if (species.id === 'smeargle') return 'Focus Sash'; + if (moves.has('clangoroussoul') || (species.id === 'toxtricity' && moves.has('shiftgear'))) return 'Throat Spray'; + if ( + (species.baseSpecies === 'Magearna' && role === 'Tera Blast user') || + ((species.id === 'calyrexice' || species.id === 'necrozmaduskmane') && isDoubles) + ) return 'Weakness Policy'; + if (['dragonenergy', 'lastrespects', 'waterspout'].some(m => moves.has(m))) return 'Choice Scarf'; + if ( + !isDoubles && (ability === 'Imposter' || (species.id === 'magnezone' && role === 'Fast Attacker')) + ) return 'Choice Scarf'; + if (species.id === 'rampardos' && (role === 'Fast Attacker' || isDoubles)) return 'Choice Scarf'; + if (species.id === 'palkia' && counter.get('Status')) return 'Lustrous Orb'; + if ( + moves.has('courtchange') || + !isDoubles && (species.id === 'luvdisc' || (species.id === 'terapagos' && !moves.has('rest'))) + ) return 'Heavy-Duty Boots'; + if ( + ['Cheek Pouch', 'Cud Chew', 'Harvest', 'Ripen'].some(m => ability === m) || + moves.has('bellydrum') || moves.has('filletaway') + ) { + return 'Sitrus Berry'; + } + 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 (counter.get('Status') && (species.name === 'Latias' || species.name === 'Latios')) return 'Soul Dew'; + if (species.id === 'scyther' && !isDoubles) return (isLead && !moves.has('uturn')) ? 'Eviolite' : 'Heavy-Duty Boots'; + if (ability === 'Poison Heal' || ability === 'Quick Feet') return 'Toxic Orb'; + if (species.nfe) return 'Eviolite'; + if ((ability === 'Guts' || moves.has('facade')) && !moves.has('sleeptalk')) { + return (types.includes('Fire') || ability === 'Toxic Boost') ? 'Toxic Orb' : 'Flame Orb'; + } + if (ability === 'Magic Guard' || (ability === 'Sheer Force' && counter.get('sheerforce'))) return 'Life Orb'; + if (ability === 'Anger Shell') return this.sample(['Expert Belt', 'Lum Berry', 'Scope Lens', 'Sitrus Berry']); + if (moves.has('dragondance') && isDoubles) return 'Clear Amulet'; + if (counter.get('skilllink') && ability !== 'Skill Link' && species.id !== 'breloom') return 'Loaded Dice'; + if (ability === 'Unburden') { + return (moves.has('closecombat') || moves.has('leafstorm')) ? 'White Herb' : 'Sitrus Berry'; + } + if (moves.has('shellsmash') && ability !== 'Weak Armor') return 'White Herb'; + if (moves.has('meteorbeam') || (moves.has('electroshot') && !teamDetails.rain)) return 'Power Herb'; + if (moves.has('acrobatics') && 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 (species.id === 'giratina' && !isDoubles && moves.has('rest') && !moves.has('sleeptalk')) return 'Leftovers'; + if ( + moves.has('rest') && !moves.has('sleeptalk') && + ability !== 'Natural Cure' && ability !== 'Shed Skin' + ) { + return 'Chesto Berry'; + } + if ( + species.id !== 'yanmega' && + this.dex.getEffectiveness('Rock', species) >= 2 && (!types.includes('Flying') || !isDoubles) + ) return 'Heavy-Duty Boots'; + } + + 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 || ruleTable.has('terastalclause')) && set.role === 'Tera Blast user') { + continue; + } + possibleSets.push(set); + } + const set = this.sampleIfArray(possibleSets); + const role = set.role; + const movePool: string[] = []; + for (const movename of set.movepool) { + movePool.push(this.dex.moves.get(movename).id); + } + const teraTypes = set.teraTypes!; + let teraType = this.sampleIfArray(teraTypes); + + let ability = ''; + let item = undefined; + + const evs = { hp: 85, atk: 85, def: 85, spa: 85, spd: 85, spe: 85 }; + const ivs = { hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31 }; + + const types = species.types; + const abilities = 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'].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; + } + + if (moves.has('gyroball') || moves.has('trickroom')) { + evs.spe = 0; + ivs.spe = 0; + } + + // hidden power time + // Hidden Power Ice IVs + if ( + moves.has('hiddenpower') && + ( + species.id === 'ninetales' || species.id === 'electrode' || species.id === 'jolteon' || species.id === 'zapdos' || + species.id === 'blastoise' || species.id === 'butterfree' || species.id === 'pikachu' || species.id === 'raichu' + ) + ) { + ivs.atk = 0; + ivs.def = 30; + } + + // Hidden Power Ground IVs + if ( + moves.has('hiddenpower') && (species.id === 'vileplume' || species.id === 'magneton' || species.id === 'victreebel') + ) { + ivs.atk = 1; + ivs.spa = 30; + ivs.spd = 30; + } + + // Hidden Power Fighting IVs + if ( + moves.has('hiddenpower') && + (species.id === 'persian' || species.id === 'gengar' || species.id === 'exeggutor' || species.id === 'porygon') + ) { + ivs.atk = 1; + ivs.def = 30; + ivs.spa = 30; + ivs.spd = 30; + ivs.spe = 30; + } + + // Hidden Power Grass IVs + if ((species.id === 'vaporeon' || species.id === 'omastar') && moves.has('hiddenpower')) { + ivs.atk = 0; + ivs.spa = 30; + } + + // 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'); + + randomRGTeam() { + 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 } = {}; + let hasMega = false; + + 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); + 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; + // for (const poke of pokemonPool[baseSpecies]) { + // const species = this.dex.species.get(poke); + // if (!hasMega && species.isMega) canMega = true; + // } + for (const poke of pokemonPool[baseSpecies]) { + const species = this.dex.species.get(poke); + // Prevent multiple megas + if (hasMega && species.isMega) continue; + // Prevent base forme, if a mega is available + // Added Abomasnow exception + // if (canMega && !species.isMega && species.id !== 'abomasnow') continue; + currentSpeciesPool.push(species); + } + // change const to let when enforcing certain mons for testing + const species = this.sample(currentSpeciesPool); + + // let 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; + + // Limit one Mega per team + if (hasMega && species.isMega) continue; + + // Treat Ogerpon formes and Terapagos like the Tera Blast user role; reject if team has one already + if ((species.baseSpecies === 'Ogerpon' || species.baseSpecies === 'Terapagos') && teamDetails.teraBlast) continue; + + // Illusion shouldn't be on the last slot + if (species.baseSpecies === 'Zoroark' && pokemon.length >= (this.maxTeamSize - 1)) continue; + + const types = species.types; + const typeCombo = types.slice().sort().join(); + const weakToFreezeDry = ( + this.dex.getEffectiveness('Ice', species) > 0 || + (this.dex.getEffectiveness('Ice', species) > -2 && types.includes('Water')) + ); + // Dynamically scale limits for different team sizes. The default and minimum value is 1. + const limitFactor = Math.round(this.maxTeamSize / 6) || 1; + + // TEMPORARILY ADJUSTING BALANCE OF THIS BLOCK -- TOO FEW POKEMON TO GENERATE TEAMS + // update: reverting these changes, but leaving just in case + if (!isMonotype && !this.forceMonotype) { + let skip = false; + + // Limit two of any type + // ADJUSTING TO 6 -- ADJUST BACK AFTER MORE POKEMON HAVE BEEN ADDED + for (const typeName of types) { + if (typeCount[typeName] >= 2 /* 6 */ * limitFactor) { + skip = true; + break; + } + } + if (skip) continue; + + // Limit three weak to any type, and one double weak to any type + // ADJUSTING TO 6 -- ADJUST BACK AFTER MORE POKEMON HAVE BEEN ADDED + for (const typeName of this.dex.types.names()) { + // it's weak to the type + if (this.dex.getEffectiveness(typeName, species) > 0) { + if (!typeWeaknesses[typeName]) typeWeaknesses[typeName] = 0; + if (typeWeaknesses[typeName] >= 3 /* 6 */ * limitFactor) { + skip = true; + break; + } + } + if (this.dex.getEffectiveness(typeName, species) > 1) { + if (!typeDoubleWeaknesses[typeName]) typeDoubleWeaknesses[typeName] = 0; + if (typeDoubleWeaknesses[typeName] >= 1 /* 6 */ * Number(limitFactor)) { + skip = true; + break; + } + } + } + if (skip) continue; + + // Count Dry Skin/Fluffy as Fire weaknesses + // ADJUSTING TO 6 -- ADJUST BACK AFTER MORE POKEMON HAVE BEEN ADDED + if ( + this.dex.getEffectiveness('Fire', species) === 0 && + Object.values(species.abilities).filter(a => ['Dry Skin', 'Fluffy'].includes(a)).length + ) { + if (!typeWeaknesses['Fire']) typeWeaknesses['Fire'] = 0; + if (typeWeaknesses['Fire'] >= 3 /* 6 */ * limitFactor) continue; + } + + // Limit four weak to Freeze-Dry + // ADJUSTING TO 6 -- ADJUST BACK AFTER MORE POKEMON HAVE BEEN ADDED + if (weakToFreezeDry) { + if (!typeWeaknesses['Freeze-Dry']) typeWeaknesses['Freeze-Dry'] = 0; + if (typeWeaknesses['Freeze-Dry'] >= 4 /* 6 */ * limitFactor) continue; + } + + // Limit one level 100 Pokemon + if (!this.adjustLevel && (this.getLevel(species, isDoubles) === 100) && numMaxLevelPokemon >= limitFactor) { + continue; + } + } + + // Limit three of any type combination in Monotype + if (!this.forceMonotype && isMonotype && (typeComboCount[typeCombo] >= 3 * limitFactor)) continue; + + // 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('Raticate-Mega'); + + 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); + pokemon.push(set); + } else { + set = this.randomSet(species, teamDetails, true, isDoubles); + pokemon.unshift(set); + leadsRemaining--; + } + } else { + set = this.randomSet(species, teamDetails, false, isDoubles); + pokemon.push(set); + } + + const item = this.dex.items.get(set.item); + + // 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 (item.megaStone) hasMega = true; + 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 RandomRGTeams; 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/rulesets.ts b/data/rulesets.ts index f051d043f3..36d53cc0ae 100644 --- a/data/rulesets.ts +++ b/data/rulesets.ts @@ -159,7 +159,7 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = { name: 'Standard Draft', desc: "The custom Draft League ruleset", ruleset: [ - 'Obtainable', 'Nickname Clause', '+Unreleased', '+CAP', 'Sketch Post-Gen 7 Moves', 'Team Preview', 'Sleep Clause Mod', 'OHKO Clause', 'Evasion Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod', + 'Obtainable', 'Nickname Clause', 'Beat Up Nicknames Mod', '+Unreleased', '+CAP', 'Sketch Post-Gen 7 Moves', 'Team Preview', 'Sleep Clause Mod', 'OHKO Clause', 'Evasion Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod', ], // timer: {starting: 60 * 60, grace: 0, addPerTurn: 10, maxPerTurn: 100, timeoutAutoChoose: true}, }, @@ -823,6 +823,18 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = { // hardcoded in team-validator.js, so we are done. }, }, + beatupnicknamesmod: { + effectType: 'Rule', + name: 'Beat Up Nicknames Mod', + desc: "Prevents Beat Up from revealing any party members, enforcing gameplay that assumes optimal Pokémon nicknaming strategies.", + onBegin() { + if (this.gen <= 4) { + this.add('rule', `Beat Up Nicknames Mod: Beat Up will not reveal any party members`); + } + }, + // https://www.smogon.com/forums/posts/8992145/ + // hardcoded in data/mods/gen3/moves.ts, data/mods/gen4/moves.ts + }, itemclause: { effectType: 'ValidatorRule', name: 'Item Clause', @@ -1054,24 +1066,6 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = { this.add('rule', 'Endless Battle Clause: Forcing endless battles is banned'); }, }, - moodyclause: { - effectType: 'ValidatorRule', - name: 'Moody Clause', - desc: "Bans the ability Moody", - banlist: ['Moody'], - onBegin() { - this.add('rule', 'Moody Clause: Moody is banned'); - }, - }, - swaggerclause: { - effectType: 'ValidatorRule', - name: 'Swagger Clause', - desc: "Bans the move Swagger", - banlist: ['Swagger'], - onBegin() { - this.add('rule', 'Swagger Clause: Swagger is banned'); - }, - }, drypassclause: { effectType: 'ValidatorRule', name: 'DryPass Clause', @@ -1445,13 +1439,13 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = { // Hardcoded in gen1/moves.ts // Can't be disabled (no precedent for how else to handle desyncs) }, - deoxyscamouflageclause: { + deoxyscamouflageclausemod: { effectType: 'Rule', - name: 'Deoxys Camouflage Clause', + name: 'Deoxys Camouflage Clause Mod', desc: "Reveals the Deoxys forme when it is sent in battle.", // Hardcoded into effect, cannot be disabled. onBegin() { - this.add('rule', 'Deoxys Camouflage Clause: Reveals the Deoxys forme when it is sent in battle.'); + this.add('rule', 'Deoxys Camouflage Clause Mod: Reveals the Deoxys forme when it is sent in battle.'); }, }, freezeclausemod: { @@ -1507,17 +1501,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 +1542,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"); @@ -1575,6 +1553,28 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = { } }, }, + sameletterclause: { + effectType: 'ValidatorRule', + name: 'Same Letter Clause', + desc: "Forces all Pokémon species on a team to start with the same letter", + onValidateTeam(team) { + let requiredLetter: string | null = null; + for (const set of team) { + const species = this.dex.species.get(set.species); + const match = /^[A-Za-z]/.exec(species.name); + if (!match) { + return [`${species.name} cannot be used, as its name does not begin with a valid English letter.`]; + } + const firstLetter = match[0].toUpperCase(); + if (!requiredLetter) { + requiredLetter = firstLetter; + } else if (firstLetter !== requiredLetter) { + return [ + `All Pokémon must belong to species starting with the same letter (currently: ${requiredLetter}); ${species.name} starts with ${firstLetter}.`]; + } + } + }, + }, megarayquazaclause: { effectType: 'Rule', name: 'Mega Rayquaza Clause', @@ -1622,34 +1622,11 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = { this.add('rule', 'Terastal Clause: You cannot Terastallize'); }, }, - arceusevlimit: { + fullarceusclause: { 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.", - ]; - } - } - } - }, + name: 'Full Arceus Clause', + desc: "Allows Level 80 Arceus from Hall of Origin", + // Implemented in sim/team-validator.ts }, inversemod: { effectType: 'Rule', @@ -1862,11 +1839,23 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = { desc: "Allows Pokémon who learn Sketch to learn any Gen 8+ move (normally, Sketch is not usable in Gen 8 or Gen 9 Pre-DLC2).", // Implemented in sim/team-validator.ts }, - mimicglitch: { + mimicglitchclause: { effectType: 'ValidatorRule', - name: 'Mimic Glitch', + name: 'Mimic Glitch Clause', desc: "Allows any Pokemon with access to Assist, Copycat, Metronome, Mimic, or Transform to gain access to almost any other move.", // Implemented in sim/team-validator.ts + onBegin() { + this.add('rule', 'Mimic Glitch Clause: Pokemon that learn Assist, Copycat, Metronome, Mimic, or Transform can have any move.'); + }, + }, + pomegglitchclause: { + effectType: 'ValidatorRule', + name: 'Pomeg Glitch Clause', + desc: "Allows any Pokémon from Generation 3 at level 5 or higher to have any of its level-up moves. This implementation is allowed only to enable an otherwise legal Pokémon to obtain moves it would not normally have access to at an earlier level.", + // Implemented in sim/team-validator.ts + onBegin() { + this.add('rule', 'Pomeg Glitch Clause: Gen 3 Pokémon at level 5+ can have any of their level-up moves.'); + }, }, overflowstatmod: { effectType: 'Rule', @@ -2227,6 +2216,12 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = { desc: "Bans move combinations on Pok\u00e9mon that weren't legal in NC 1997.", // Implemented in mods/gen1jpn/rulesets.ts }, + stadiumpokecuprentals: { + effectType: 'ValidatorRule', + name: "Stadium Poke Cup Rentals", + desc: `Enforces Stadium Poké Cup Rentals legality`, + // Implemented in mods/gen1stadium/rulesets.ts + }, noswitching: { effectType: 'Rule', name: 'No Switching', @@ -2523,12 +2518,13 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = { const item = pokemon.getItem(); if (/^tr\d\d/i.test(item.name)) { const move = this.dex.moves.get(item.desc.split('move ')[1].split('.')[0]); + const pp = this.calculatePP(move); pokemon.moveSlots = (pokemon as any).baseMoveSlots = [ ...pokemon.baseMoveSlots, { id: move.id, move: move.name, - pp: move.pp * 8 / 5, - maxpp: move.pp * 8 / 5, + pp, + maxpp: pp, target: move.target, disabled: false, disabledSource: '', @@ -2666,12 +2662,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 +2687,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/data/text/abilities.ts b/data/text/abilities.ts index 49a91d02da..a5990e6191 100644 --- a/data/text/abilities.ts +++ b/data/text/abilities.ts @@ -379,6 +379,11 @@ export const AbilitiesText: { [id: IDEntry]: AbilityText } = { desc: "On switch-in, this Pokemon's Attack or Special Attack is raised by 1 stage based on the weaker combined defensive stat of all opposing Pokemon. Attack is raised if their Defense is lower, and Special Attack is raised if their Special Defense is the same or lower.", shortDesc: "On switch-in, Attack or Sp. Atk is raised 1 stage based on the foes' weaker Defense.", }, + dragonize: { + name: "Dragonize", + desc: "This Pokemon's Normal-type moves become Dragon-type moves and have their power multiplied by 1.2. This effect comes after other effects that change a move's type, but before Ion Deluge and Electrify's effects.", + shortDesc: "This Pokemon's Normal-type moves become Dragon type and have 1.2x power.", + }, dragonsmaw: { name: "Dragon's Maw", shortDesc: "This Pokemon's offensive stat is multiplied by 1.5 while using a Dragon-type attack.", @@ -980,6 +985,10 @@ export const AbilitiesText: { [id: IDEntry]: AbilityText } = { desc: "This Pokemon's pulse moves have their power multiplied by 1.5. Heal Pulse restores 3/4 of a target's maximum HP, rounded half down.", shortDesc: "This Pokemon's pulse moves have 1.5x power. Heal Pulse heals 3/4 target's max HP.", }, + megasol: { + name: "Mega Sol", + shortDesc: "This Pokemon's moves are used as if the effects of Sunny Day were active.", + }, merciless: { name: "Merciless", shortDesc: "This Pokemon's attacks are critical hits if the target is poisoned.", @@ -1239,6 +1248,10 @@ export const AbilitiesText: { [id: IDEntry]: AbilityText } = { addItem: "#recycle", }, + piercingdrill: { + name: "Piercing Drill", + shortDesc: "This Pokemon's contact moves ignore a target's protection and deal 1/4 the usual damage.", + }, pixilate: { name: "Pixilate", desc: "This Pokemon's Normal-type moves become Fairy-type moves and have their power multiplied by 1.2. This effect comes after other effects that change a move's type, but before Ion Deluge and Electrify's effects.", @@ -1755,6 +1768,10 @@ export const AbilitiesText: { [id: IDEntry]: AbilityText } = { desc: "This Pokemon's Speed is raised by 1 stage at the end of each full turn it has been on the field.", shortDesc: "This Pokemon's Speed is raised 1 stage at the end of each full turn on the field.", }, + spicyspray: { + name: "Spicy Spray", + shortDesc: "If this Pokemon is hit by an attack, the attacker becomes burned.", + }, stakeout: { name: "Stakeout", shortDesc: "This Pokemon's offensive stat is doubled against a target that switched in this turn.", diff --git a/lib/database.ts b/lib/database.ts index 86027214b4..13ccb5ba61 100644 --- a/lib/database.ts +++ b/lib/database.ts @@ -6,14 +6,31 @@ * @author Zarel */ -import * as mysql from 'mysql2'; -import * as pg from 'pg'; +import type * as mysql from 'mysql2'; +import type * as pg from 'pg'; export type BasicSQLValue = string | number | null; export type SQLRow = { [k: string]: BasicSQLValue }; export type SQLValue = BasicSQLValue | SQLStatement | SQLStatement[] | PartialOrSQL | BasicSQLValue[] | undefined; +let mysqlRuntime: typeof import('mysql2'); +let pgRuntime: typeof import('pg'); + +// Lazy-load mysql2 +try { + mysqlRuntime = require('mysql2'); +} catch { + // Only throw if someone tries to use MySQL +} + +// Lazy-load pg +try { + pgRuntime = require('pg'); +} catch { + // Only throw if someone tries to use Postgres +} + export function isSQL(value: any): value is SQLStatement { /** * This addresses a scenario where objects get out of sync due to hotpatching. @@ -333,12 +350,13 @@ export class DatabaseTable { export class MySQLDatabase extends Database { override type = 'mysql' as const; constructor(config: mysql.PoolOptions & { prefix?: string }) { + if (!mysqlRuntime) throw new Error(`Install the 'mysql2' module to use a MySQL database`); const prefix = config.prefix || ""; if (config.prefix) { config = { ...config }; delete config.prefix; } - super(mysql.createPool(config), prefix); + super(mysqlRuntime.createPool(config), prefix); } override _resolveSQL(query: SQLStatement): [query: string, values: BasicSQLValue[]] { let sql = query.sql[0]; @@ -375,14 +393,16 @@ export class MySQLDatabase extends Database { return this._query(sql, values); } override escapeId(id: string) { - return mysql.escapeId(id); + if (!mysqlRuntime) throw new Error(`Install the 'mysql2' module to use a MySQL database`); + return mysqlRuntime.escapeId(id); } } export class PGDatabase extends Database { override type = 'pg' as const; constructor(config: pg.PoolConfig) { - super(config ? new pg.Pool(config) : null!); + if (!pgRuntime) throw new Error(`Install the 'pg' module to use a Postgres database`); + super(config ? new pgRuntime.Pool(config) : null!); } override _resolveSQL(query: SQLStatement): [query: string, values: BasicSQLValue[]] { let sql = query.sql[0]; @@ -407,7 +427,8 @@ export class PGDatabase extends Database(query, values).then(res => ({ affectedRows: res.rowCount })); } override escapeId(id: string) { + if (!pgRuntime) throw new Error(`Install the 'pg' module to use a Postgres database`); // @ts-expect-error @types/pg really needs to be updated - return pg.escapeIdentifier(id); + return pgRuntime.escapeIdentifier(id); } } 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/admin.ts b/server/chat-commands/admin.ts index 2dea153104..9e5fdee50a 100644 --- a/server/chat-commands/admin.ts +++ b/server/chat-commands/admin.ts @@ -1627,126 +1627,7 @@ export const commands: Chat.ChatCommands = { throw new Chat.ErrorMessage("/editbattle - This is not a battle room."); } const battle = room.battle; - let cmd; - [cmd, target] = Utils.splitFirst(target, ' '); - if (cmd.endsWith(',')) cmd = cmd.slice(0, -1); - const targets = target.split(','); - if (targets.length === 1 && targets[0] === '') targets.pop(); - let player, pokemon, move, stat, value; - switch (cmd) { - case 'hp': - case 'h': - if (targets.length !== 3) { - this.errorReply("Incorrect command use"); - return this.parse('/help editbattle'); - } - [player, pokemon, value] = targets.map(f => f.trim()); - [player, pokemon] = [player, pokemon].map(toID); - void battle.stream.write( - `>eval let p=pokemon('${player}', '${pokemon}');p.sethp(${parseInt(value)});` + - `if (p.isActive)battle.add('-damage',p,p.getHealth);` - ); - break; - case 'status': - case 's': - if (targets.length !== 3) { - this.errorReply("Incorrect command use"); - return this.parse('/help editbattle'); - } - [player, pokemon, value] = targets.map(toID); - void battle.stream.write( - `>eval let pl=player('${player}');let p=pokemon(pl,'${pokemon}');p.setStatus('${value}');if (!p.isActive){battle.add('','please ignore the above');battle.add('-status',pl.active[0],pl.active[0].status,'[silent]');}` - ); - break; - case 'pp': - if (targets.length !== 4) { - this.errorReply("Incorrect command use"); - return this.parse('/help editbattle'); - } - [player, pokemon, move, value] = targets.map(f => f.trim()); - [player, pokemon, move] = [player, pokemon, move].map(toID); - void battle.stream.write( - `>eval pokemon('${player}','${pokemon}').getMoveData('${move}').pp = ${parseInt(value)};` - ); - break; - case 'boost': - case 'b': - if (targets.length !== 4) { - this.errorReply("Incorrect command use"); - return this.parse('/help editbattle'); - } - [player, pokemon, stat, value] = targets.map(f => f.trim()); - [player, pokemon, stat] = [player, pokemon, stat].map(toID); - void battle.stream.write( - `>eval let p=pokemon('${player}','${pokemon}');battle.boost({${stat}:${parseInt(value)}},p)` - ); - break; - case 'volatile': - case 'v': - if (targets.length !== 3) { - this.errorReply("Incorrect command use"); - return this.parse('/help editbattle'); - } - [player, pokemon, value] = targets.map(toID); - void battle.stream.write( - `>eval pokemon('${player}','${pokemon}').addVolatile('${value}')` - ); - break; - case 'sidecondition': - case 'sc': - if (targets.length !== 2) { - this.errorReply("Incorrect command use"); - return this.parse('/help editbattle'); - } - [player, value] = targets.map(toID); - void battle.stream.write(`>eval player('${player}').addSideCondition('${value}', 'debug')`); - break; - case 'fieldcondition': case 'pseudoweather': - case 'fc': - if (targets.length !== 1) { - this.errorReply("Incorrect command use"); - return this.parse('/help editbattle'); - } - [value] = targets.map(toID); - void battle.stream.write(`>eval battle.field.addPseudoWeather('${value}', 'debug')`); - break; - case 'weather': - case 'w': - if (targets.length !== 1) { - this.errorReply("Incorrect command use"); - return this.parse('/help editbattle'); - } - [value] = targets.map(toID); - void battle.stream.write(`>eval battle.field.setWeather('${value}', 'debug')`); - break; - case 'terrain': - case 't': - if (targets.length !== 1) { - this.errorReply("Incorrect command use"); - return this.parse('/help editbattle'); - } - [value] = targets.map(toID); - void battle.stream.write(`>eval battle.field.setTerrain('${value}', 'debug')`); - break; - case 'reseed': - if (targets.length !== 0) { - if (targets.length !== 4) { - this.errorReply("Seed must have 4 parts"); - return this.parse('/help editbattle'); - } - // this just tests for a 5-digit number, close enough to uint16 - if (!targets.every(val => /^[0-9]{1,5}$/.test(val))) { - this.errorReply("Seed parts much be unsigned 16-bit integers"); - return this.parse('/help editbattle'); - } - } - void battle.stream.write(`>reseed ${targets.join(',')}`); - if (targets.length) this.sendReply(`Reseeded to ${targets.join(',')}`); - break; - default: - this.errorReply(`Unknown editbattle command: ${cmd}`); - return this.parse('/help editbattle'); - } + void battle.stream.write(`>editbattle user:${user.name}, ${target}`); }, editbattlehelp: [ `/editbattle hp [player], [pokemon], [hp]`, diff --git a/server/chat-commands/avatars.tsx b/server/chat-commands/avatars.tsx index 2e0692f31d..83ac22c41f 100644 --- a/server/chat-commands/avatars.tsx +++ b/server/chat-commands/avatars.tsx @@ -554,6 +554,7 @@ const OFFICIAL_AVATARS_BRUMIRAGE = new Set([ 'oleana', 'opal', 'peony', 'pesselle', 'phoebe-gen6', 'piers', 'raihan', 'rei', 'rose', 'sabi', 'sada-ai', 'sanqua', 'shielbert', 'sonia', 'sonia-professor', 'sordward', 'sordward-shielbert', 'tateandliza-gen6', 'turo-ai', 'victor', 'victor-dojo', 'volo', 'yellgrunt', 'yellgruntf', 'zisu', 'miku-flying', 'miku-ground', + 'jacinthe', 'rainbowrocketgrunt', 'rainbowrocketgruntf', ]); const OFFICIAL_AVATARS_ZACWEAVILE = new Set([ @@ -644,6 +645,8 @@ const OFFICIAL_AVATARS_KYLEDOVE = new Set([ 'baoba', 'bill', 'daisy', 'harmony', 'paxton', 'trace', 'az-lza', 'brendan-masters2', 'bugsy-masters', 'cynthia-masters4', 'elesa-masters3', 'elio-masters', 'erika-masters3', 'iono-masters', 'iono-masters2', 'lance-masters2', 'marley-masters', 'may-masters4', 'morty-masters3', 'selene-masters2', 'shauntal-masters', + 'ansha', 'ansha-cook', 'canari', 'corbeau', 'grisham', 'gwynn', 'ivor', 'lebanne', 'phillipe', 'sbcmember', + 'tarragon', 'taunie', 'urbain', ]); const OFFICIAL_AVATARS_HYOOPPA = new Set([ @@ -737,7 +740,7 @@ export const commands: Chat.ChatCommands = { this.sendReply(`|raw|(${this.tr`Artist: `}Grapo)`); } if (OFFICIAL_AVATARS_FIFTY.has(avatar)) { - this.sendReply(`|raw|(${this.tr`Artist: `}Fifty Shades of Rez)`); + this.sendReply(`|raw|(${this.tr`Artist: `}Fifty Shades of Rez)`); } if (OFFICIAL_AVATARS_HORO.has(avatar)) { this.sendReply(`|raw|(${this.tr`Artist: `}Horo)`); @@ -769,12 +772,11 @@ export const commands: Chat.ChatCommands = { const targetUser = this.broadcasting && !target ? null : this.getUserOrSelf(target); const targetUserids = targetUser ? new Set([targetUser.id, ...targetUser.previousIDs]) : target ? new Set([toID(target)]) : null; - if (targetUserids && targetUser !== user && !user.can('alts')) { - throw new Chat.ErrorMessage("You don't have permission to look at another user's avatars!"); - } const out = []; - if (targetUserids) { + if (targetUserids && (targetUser === user || user.can('alts'))) { + // If the user lacks permission to view avatars, the argument is ignored silently, + // so that it can highlight the target user. const hasButton = !this.broadcasting && targetUser === user; for (const id of targetUserids) { const allowed = customAvatars[id]?.allowed; diff --git a/server/chat-commands/core.ts b/server/chat-commands/core.ts index 439cb4d898..7c24e7367d 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: [ @@ -925,7 +924,9 @@ export const commands: Chat.ChatCommands = { } } - let resultString = Utils.escapeHTML(Teams.export(team, { hideStats })); + let resultString = Utils.escapeHTML(Teams.export(team, { + hideStats, useStatPoints: toID(battle.format).includes('champions'), + })); if (showAll) { resultString = `
${this.tr`View team`}${resultString}
`; } diff --git a/server/chat-commands/info.ts b/server/chat-commands/info.ts index ca1eb36bf0..ffd8857c29 100644 --- a/server/chat-commands/info.ts +++ b/server/chat-commands/info.ts @@ -754,7 +754,9 @@ export const commands: Chat.ChatCommands = { const pastGensOnly = (move.isNonstandard === "Past" && dex.gen >= 8) || (move.isNonstandard === "Gigantamax" && dex.gen !== 8); if (pastGensOnly) details["✗ Past Gens Only"] = ""; - if (move.secondary || move.secondaries || move.hasSheerForce) details["✓ Boosted by Sheer Force"] = ""; + if (move.secondary || move.secondaries || move.hasSheerForceBoost) { + details["✓ Boosted by Sheer Force"] = ""; + } if (move.flags['contact'] && dex.gen >= 3) details["✓ Contact"] = ""; if (move.flags['sound'] && dex.gen >= 3) details["✓ Sound"] = ""; if (move.flags['bullet'] && dex.gen >= 6) details["✓ Bullet"] = ""; @@ -2128,7 +2130,7 @@ export const commands: Chat.ChatCommands = { ], faq(target, room, user) { - target = toID(target); + target = toID(this.splitOne(target)[0]); const showAll = target === 'all'; if (showAll && this.shouldBroadcast()) { throw new Chat.ErrorMessage(this.tr`You cannot broadcast all FAQs at once.`); diff --git a/server/chat-commands/moderation.ts b/server/chat-commands/moderation.ts index 442d12f971..38e9e21261 100644 --- a/server/chat-commands/moderation.ts +++ b/server/chat-commands/moderation.ts @@ -1841,7 +1841,7 @@ export const commands: Chat.ChatCommands = { targetUser.send(`|nametaken||${user.name} considers your name inappropriate${(publicReason ? `: ${publicReason}` : ``)}`); } else { forceRenameMessage = `was forced to choose a new name by ${user.name} while offline${(publicReason ? `: ${publicReason}` : ``)}`; - this.globalModlog('FORCERENAME OFFLINE', targetUser, privateReason); + this.globalModlog('FORCERENAME OFFLINE', targetID, privateReason); } Monitor.forceRenames.set(targetID, false); 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/daily-spotlight.ts b/server/chat-plugins/daily-spotlight.ts index 4dad14fc0b..c8bb39ec37 100644 --- a/server/chat-plugins/daily-spotlight.ts +++ b/server/chat-plugins/daily-spotlight.ts @@ -279,7 +279,7 @@ export const commands: Chat.ChatCommands = { daily(target, room, user) { room = this.requireRoom(); if (!room.persist) throw new Chat.ErrorMessage("This command is unavailable in temporary rooms."); - const key = toID(target); + const key = toID(this.splitOne(target)[0]); if (!key) return this.parse('/help daily'); if (!spotlights[room.roomid]?.[key]) { diff --git a/server/chat-plugins/datasearch.ts b/server/chat-plugins/datasearch.ts index 2526285def..140ef725c5 100644 --- a/server/chat-plugins/datasearch.ts +++ b/server/chat-plugins/datasearch.ts @@ -2118,7 +2118,7 @@ function runMovesearch(target: string, cmd: string, message: string, isTest: boo for (const flag in alts.flags) { if (flag === 'secondary') { - if (!(move.secondary || move.secondaries || move.hasSheerForce) === !alts.flags[flag]) { + if (!(move.secondary || move.secondaries || move.hasSheerForceBoost) === !alts.flags[flag]) { matched = true; break; } diff --git a/server/chat-plugins/github.ts b/server/chat-plugins/github.ts index e0dab37398..6953451e92 100644 --- a/server/chat-plugins/github.ts +++ b/server/chat-plugins/github.ts @@ -9,7 +9,7 @@ import { FS, Utils } from '../../lib'; const STAFF_REPOS = Config.staffrepos || [ 'pokemon-showdown', 'pokemon-showdown-client', 'Pokemon-Showdown-Dex', 'pokemon-showdown-loginserver', ]; -const COOLDOWN = 10 * 60 * 1000; +const COOLDOWN = 60 * 60 * 1000; export const gitData: GitData = JSON.parse(FS("config/chat-plugins/github.json").readIfExistsSync() || "{}"); diff --git a/server/chat-plugins/helptickets.ts b/server/chat-plugins/helptickets.ts index 766688deb1..249739ba48 100644 --- a/server/chat-plugins/helptickets.ts +++ b/server/chat-plugins/helptickets.ts @@ -1365,7 +1365,7 @@ export const textTickets: { [k: string]: TextTicketInfo } = { const str = ipPunishments.map(p => ( `${Punishments.punishmentTypes.get(p.type)?.desc || p.type} as ` + `${p.id}` + - `${p.reason ? ` (${p.reason})` : ''}` + (p.reason ? Utils.html` (${p.reason})` : '') )); if (str) buf += `Punishments: ${str.join(' | ')}
`; } diff --git a/server/chat-plugins/laddertours.ts b/server/chat-plugins/laddertours.ts index 518ae8041e..fccbada35f 100644 --- a/server/chat-plugins/laddertours.ts +++ b/server/chat-plugins/laddertours.ts @@ -87,13 +87,17 @@ export class LadderTracker { this.deadline = date; if (this.final) clearTimeout(this.final); + const timeDiff = (+this.deadline - Date.now()) - 500; + if (timeDiff >= Number.MAX_SAFE_INTEGER) { + throw new Chat.ErrorMessage("Deadline is too far away. Please wait and set it later."); + } // We set the timer to fire slightly before the deadline and then // repeatedly do process.nextTick checks for accuracy this.final = setTimeout(() => { this.stop(); // eslint-disable-next-line @typescript-eslint/no-floating-promises this.captureFinalLeaderboard(); - }, (+this.deadline - Date.now()) - 500); + }, timeDiff); if (save) LadderTracker.save(); } 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..17a5bb7a11 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 += `