diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index a30cb642a46..032e1fee69c 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,37 +1,76 @@ - - - + + + + ## What are the changes the user will see? ## Why am I making these changes? - - - + + ## What are the changes from a developer perspective? - - + -### Screenshots/Videos - - +## Screenshots/Videos + ## How to test the changes? - - - - + ## Checklist - [ ] **I'm using `beta` as my base branch** - [ ] There is no overlap with another PR? - [ ] The PR is self-contained and cannot be split into smaller PRs? - [ ] Have I provided a clear explanation of the changes? -- [ ] Have I considered writing automated tests for the issue? -- [ ] If I have text, did I make it translatable and add a key in the English locale file(s)? -- [ ] Have I tested the changes (manually)? - - [ ] Are all unit tests still passing? (`npm run test`) -- [ ] Are the changes visual? - - [ ] Have I provided screenshots/videos of the changes? +- [ ] Have I tested the changes manually? +- [ ] Are all unit tests still passing? (`npm run test`) + - [ ] Have I created new automated tests (`npm run create-test`) or updated existing tests related to the PR's changes? +- [ ] Have I provided screenshots/videos of the changes (if applicable)? + - [ ] Have I made sure that any UI change works for both UI themes (default and legacy)? + +Are there any localization additions or changes? If so: +- [ ] Has a locales PR been created on the [locales](https://github.com/pagefaultgames/pokerogue-locales) repo? + - [ ] If so, please leave a link to it here: +- [ ] Has the translation team been contacted for proofreading/translation? \ No newline at end of file diff --git a/CREDITS.md b/CREDITS.md new file mode 100644 index 00000000000..0fe0a8dc290 --- /dev/null +++ b/CREDITS.md @@ -0,0 +1,620 @@ +# 🎵 Music + +## BGM +- Pokémon Mystery Dungeon: Explorers of Sky + - Arata Iiyoshi + - Hideki Sakamoto + - Keisuke Ito + - Ken-ichi Saito + - Yoshihiro Maeda +- Pokémon Black/White + - Go Ichinose + - Hitomi Sato + - Shota Kageyama +- Pokémon Mystery Dungeon: Rescue Team DX + - Keisuke Ito + - Arata Iiyoshi + - Atsuhiro Ishizuna +- Pokémon HeartGold/SoulSilver +- Pokémon Black/White 2 +- Pokémon X/Y +- Pokémon Omega Ruby/Alpha Sapphire +- Pokémon Sun/Moon +- Pokémon Ultra Sun/Ultra Moon +- Pokémon Sword/Shield +- Pokémon Legends: Arceus +- Pokémon Scarlet/Violet +- Firel (Custom Graveyard, Ice Cave, Laboratory, Metropolis, Plains, Power Plant, Seabed, Space, and Volcano biome music) +- Lmz (Custom Ancient Ruins, Jungle, and Lake biome music) +- Andr06 (Custom Forest, Slum and Sea biome music) +- _tresnoir +- unveiler + +## Sound Effects +- Pokémon Emerald +- Pokémon Black/White + + +# 🎨 Art + +## Backgrounds +- Squip (Paid Commissions) +- Contributions by Someonealive-QN + +## UI +- GAMEFREAK +- LJ Birdman + +## Pagefault Games Intro +- Spectremint + +## Game Logo +- Gonstar (Paid Commission) + +## Trainer Sprites +- GAMEFREAK (Pokémon Black/White 2, Pokémon Diamond/Pearl) +- kyledove +- Brumirage +- pkmn_realidea (Paid Commissions) +- IceJkai +- Leparagon +- wormhood + +## Mystery Event Sprites +- chrysomelinae +- koda_want_to_sleep +- “🐺Kieran/YJ 🐍” rival_kieran aka thedreadedden +- ImperialSympathizer +- wormhood +- gerolau +- otterwatch + +## Trainer Portraits +- pkmn_realidea (Paid Commissions) + +## Pokémon Sprites and Animation +In addition to the lists below, please check [the PokéRogue wiki](https://wiki.pokerogue.net/credits:credits) for a more detailed list of Pokémon Sprite credits. + +- GAMEFREAK (Pokémon Black/White 2) +- Smogon Sprite Project (Various Artists) +- Skyflyer +- Nolo33 +- Ebaru +- EricLostie +- kiriaura +- Caruban +- Sopita_Yorita +- Azrita +- AshnixsLaw +- Hellfire0raptor +- RetroNC +- Franark122k +- OldSoulja +- PKMarioG +- ItsYugen +- lucasomi +- Pkm Sinfonia +- Poki Papillon +- Fleimer_ +- bizcoeindoloro +- mangalos810 +- selstar + +### Static Sprites and Base Shiny Replacements Credits +- AMVictory +- Antiant +- Arhops +- arinoelle +- Arkeis +- aXl +- BananaToast +- Basic Vanillite +- BlackWhiteRobin +- Blaquaza +- Branflakes325 +- Brylark +- Buna +- Bynine +- Corson +- Cynda +- “Diashi” diazhi +- Dleep +- doomchaos +- Espeon Scientist +- Farriella +- fishbowlsoul90 +- “Follower” rulerofthesea11 +- Galifia +- GeoisEvil +- G.E.Z. +- Glustora +- Harrie +- HealnDeal +- Hematite +- HM100 +- Ice-cold Claws +- Involuntary Twitch +- “Jay” itsamejay +- KattenK +- KingOfThe-X-Roads +- KyleDove +- Kyleo +- Kyuzeth +- Larryturbo +- Layell +- Legitimate Username +- leParagon +- “LJ” lj_birdman +- Luigi Player +- Madmadness65 +- Mega-Pokebattlerz +- Mintly +- mjco +- “Momo” sphinx_sage +- MrDollSteak +- MyMarshlands +- N-Kin +- Noscium +- “Nova” fabunova +- “Omniv” omniv +- paintseagull +- princessofmusic +- PumpkinPastel +- Quanyails +- RadicalCharizard +- RedRooster +- “♂ROMEO⚧” gerolau +- ruleroftheseas11 +- SelenaArmorclaw +- “serif” serifaizawa +- Siiilver +- Sleet +- Snivy101 +- Speed-X +- Sphex +- Spook +- Squip +- TeraVolt +- TheAetherPlayer +- TheCynicalPoet +- Tooni +- TrainerSplash +- Travis +- Turtleye +- Tyrell D. Barnes +- “Vari” \_vari\_ +- Wobblebuns +- WolfPP +- WPS +- Wyverii +- “zan” smtif +- Zerudez +- Z-nogyroP + +### Animated Sprites Credits +- Antiant +- arinoelle +- Blaquaza +- Claire Starsword +- Coyotango +- DanEx +- “Diashi” diazhi +- GalacticArtistMuffin +- G.E.Z. +- hexagonereal +- HM100 +- Katten +- LeParagon +- localghost +- MallowOut +- mattiwarden +- “Momo” sphinx_sage +- N-Kin +- NoelleMBrooks +- Nyx +- “Omniv” omniv +- princessofmusic +- PumpkinPastel +- RadicalCharizard +- seleccion +- SelenaArmorclaw +- TheAetherPlayer +- Tinkatooni +- Typhlito +- uppa +- “Vari” \_vari\_ + +### Rare/Epic Shiny Variants Credits +- “Andr06” andr06 +- “Appo” appo +- “Ashhawk” k_redacted +- “Auralite” _auralite +- “Awesome_Soul” awesome_soul +- “Bagon” bagonganda +- “Bibble” nuts_. +- “BloomOfWoods” bloomofwoods +- “Buge” buge +- “bun” bunove +- “bukie” bukie +- cameranian +- “Caramel” saltedcarriemel +- “Chocolate Niblets” choconibs +- “CKC” ckc_ +- “ClawsHDi” clawshdi +- “Clown Princess” clown_princess +- “Cmac2173” cmac2173 +- “Corsola” corsola_bandit +- “Criminon” criminon +- “Cryptican Gogoat Enthusiast” crypticanexe +- “Diashi” diazhi +- “deviant.daffodil, bug enthusiast” deviant.daffodil +- “DigitalVaporeon” digitalvaporeon +- dingosig +- “Eku” ekusas00 +- “Elefante” +- “Esca” colossalsquid +- “Folf” folf. +- “Follower” ruleroftheseas11 +- “Fontbane” fontbane +- “Gallow” gallowhound +- “Giojoe” giojoe10 +- “Gonfold” gonfold +- greenninja757 +- “Grassy_Storm” grassy_storm +- “GreenMegaMan” greenmegaman +- “GROWL” myflixer.to +- “guy claiming to work on a guide” 7thatlas +- “h. 🍄” letterh. +- “hamez” .hamez +- “Hanniel” hanniel.15 +- “ImaginaryNeon” imaginaryneon +- “Jay” itsamejay +- “Jelke” jelke +- kalikimothy +- “🐺Kieran/YJ 🐍” rival_kieran aka thedreadedden +- “Koda” Koda_want_to_sleep +- “Lana” smogonian +- “LJ” lj_birdman +- “Long Girl” docamakesart +- “Lucky” luckyluckylucky +- “MissingNo.” clickonflareblitz +- “Momo” sphinx_sage +- monkehestman +- “Nexxus” nexxus_ +- “Nik :3” realniktrustme +- “Nikolatsu” +- “nora” ora.n +- “NOVA” fabunova +- officerporkchops +- “Omniv” omniv +- “Otterwatch” otterwatch_ +- “Pandoraz” pandoraz +- “Papa Pepsm An” papapepsman +- “Penguin” peng06 +- “Prodigy” lorekeeperprodigy +- “Purpenigma” purpenigma +- “Rage” ragerevival +- “♂ROMEO⚧” gerolau +- “Sagrell D'Arcadia” coffeerequired +- “serif” serifaizawa +- “SillyTopplingGoose” sillytopplinggoose +- “Splash Damage” splashceles +- “Sweg1b01” sweg1b01 +- “SyntheGrim” synthegrim +- “TaMenace” tamariontherestless +- “TheTRUEgge” thetruegge +- “Thorn” crownofthorns +- “Togepi” togepimax +- “Toopy” .toopy +- “Tristan” tristan.w +- “Umbreon” umbreon\_.\_ +- “Vari” \_vari\_ +- “Waasephi” +- wormhood +- “Yep, it's Caio” yepitscaio +- “Ymri” ymri +- “zaccie” zaccie +- “zan” smtif + +## Move Animations +- Pokémon Reborn + + +# ⚖️ Balance + +## Balance Team +- damocleas +- Blitzy aka Kazapple +- Cynthia_calliope +- Esca +- Fontbane +- Plasto +- Sethcurry +- Starkrieg + +## Past Members +- Swizzo +- Zaccie + +## Past Contributors +- chrysomelinae (Mystery Events) +- AsdarDevelops (Mystery Events) + + +# 💻 Development + +## Server Owner/Administrator +- pancakes aka patapancakes + +## Senior Developers +- Walker +- NightKev +- Moka +- Temp aka Tempo-anon +- Madmadness65 + +## Developers +- CodeTappert +- flx-sta +- innerthunder +- frutescens +- Opaquer +- SN34KZ +- Swain aka torranx + +## Junior Developers +- KimJeongSun +- ImperialSympathizer + +## Bug/Issue Managers +- Snailman +- Daleks +- Lily +- PigeonBar + +## Past Contributors +- Fontbane +- sodaMelon +- schmidtc1 +- shayebeadling +- DustinLin +- lucfd +- madibye +- EmberCM +- Mewtwo2387 +- hayuna +- sirzento +- ReneGV +- mattrossdev +- zacharied +- NxKarim +- td76099 +- Xiaphear +- j-diefenbach +- jaimefd +- EvasiveAce +- EmoUsedHM01 +- francktrouillez +- JakubHanko +- FredeX +- PigeonBar +- prime-dialga +- rnicar245 +- rationality6 +- Neverblade +- Corrade +- Admiral-Billy +- okimin +- Arxalc +- PrabbyDD +- JonStudders +- karl-police +- prateau +- meepen +- arColm +- allen925 +- InfernoVulpix +- snoozbuster +- zaccie +- happinyz +- PyGaVS +- mcmontag +- ElizaAlex +- AsdarDevelops +- Vassiat +- RedstonewolfX +- Sam/Flashfyre (initial developer, started PokéRogue) +- Greenlamp +- bennybroseph +- OrangeRed +- Dakurei +- Brain Frog + + +# 🌎 Translation + +## In-Game Translators + +### 🇩🇪 German (de) +- CodeTappert + +### 🇪🇸 Spanish (es-ES) +- Dan Stevenson +- Javi +- Lily Alterni +- Qyxgames + +### 🇫🇷 French (fr) +- Lugiadrien + +### 🇮🇹 Italian (it) +- Nicus + +### 🇯🇵 Japanese (ja) +- 6mozuke9 +- Chapybara +- PeachFresca + +### 🇰🇷 Korean (ko) +- Enoch +- KimJeongSun +- Returntoice +- sodamelon + +### 🇧🇷 Portuguese (pt-BR) +- Zé Ricardo + +### 🇨🇳 Chinese (zh-CN) +- dddsenic +- mercurius +- VittorioVeneto +- Yonmaru + +### 🇹🇼 Chinese (zh-TW) +- mercurius +- Seagull + +### Past contributors +- Asdar (es-ES) +- Rafa (es-ES) +- GINK-SS (ko) +- prostagma (pt-BR) +- Ei (zh-TW) + +## Wiki Translators + +### 🇪🇸 Spanish (es-ES) +- victorcooler + +### 🇫🇷 French (fr) +- Evan +- Mitsue +- Papier +- Sangara +- Voltarix + +### 🇮🇹 Italian (it) +- Purce +- T-reds + +### 🇰🇷 Korean (ko) +- LeKaaN +- Returntoice +- sodamelon + +### 🇵🇱 Polish (pl) +- Talo + +### 🇧🇷 Portuguese (pt-BR) +- Beast +- Sushi +- Zé Ricardo + +### 🇨🇳 Chinese (zh-CN) +- jw-0- + +### Past contributors +- Dietaube (de) +- Gnorpelltroll (de) +- xRegix (de) +- Broly Ikari (fr) +- Leo Edgar_Zimmer (fr) +- Telor (fr) +- dorri (ko) +- Little Moder_eldenring (ko) +- Andy (zh-CN) +- Black Feather (zh-CN) +- itschili (zh-CN) +- RimKnight (zh-CN) +- Yubari (zh-CN) + +## 🇺🇸 English Proofreaders +- Cheyu +- Faust +- HaywiredUp +- Irridescence +- Ke'ahi +- Louie +- Nully +- PeD +- The Programmer + +### Past contributors +- I... + + +# 📰 Wiki + +## Wiki Head +- H.A.R.V. + +## Wiki Lead +- Sangara +- Zac +- Smew +- Brain Frog +- Hannah + +## Editor +- Prodigy +- Akuma +- Dan Gioia +- Shimizoki +- Stave +- NalysArbur +- Ceimir +- Solanum Tuberosum +- Pom + +## Artist +- dub +- SmashMania +- Wren +- Lugiadrien + +## Contributor +- Daleks <3 +- Inferno Vulpix +- Embri +- Nekod +- P0kemonY +- Scoom +- BlueVaron + + +# ☎️ Discord + +## Head Moderator +- leah + +## Senior Moderators +- Solanum Tuberosum +- Madmadness65 +- Necrowmancer +- lana + +## Moderators +- Sethcurry + +## Junior Moderators +- chacolah +- ChaosGrimmon +- Cynthia +- Kat +- lyn +- Pom + + +# ✨ Special Thanks + +## Reddit Moderators +- TheZigglez +- Vicksin +- Sapphire +- Javi +- roi + +## External Tools +- Ydarissep (RogueDex) +- Admiral-Billy (Offline App - Desktop) +- Red aka StonedModder (iOS App) diff --git a/README.md b/README.md index 866687d54b7..607a42e5125 100644 --- a/README.md +++ b/README.md @@ -37,92 +37,6 @@ For detailed guidelines on documenting your code, refer to the [comments.md](./d Check out [Github Issues](https://github.com/pagefaultgames/pokerogue/issues) to see how can you help us! # 📝 Credits -> If this project contains assets you have produced and you do not see your name here, **please** reach out. +> If this project contains assets you have produced and you do not see your name, **please** reach out, either [here on GitHub](https://github.com/pagefaultgames/pokerogue/issues/new) or via [Discord](https://discord.gg/pokerogue). -### 🎵 BGM - - Pokémon Mystery Dungeon: Explorers of Sky - - Arata Iiyoshi - - Hideki Sakamoto - - Keisuke Ito - - Ken-ichi Saito - - Yoshihiro Maeda - - Pokémon Black/White - - Go Ichinose - - Hitomi Sato - - Shota Kageyama - - Pokémon Mystery Dungeon: Rescue Team DX - - Keisuke Ito - - Arata Iiyoshi - - Atsuhiro Ishizuna - - Pokémon HeartGold/SoulSilver - - Pokémon Black/White 2 - - Pokémon X/Y - - Pokémon Omega Ruby/Alpha Sapphire - - Pokémon Sun/Moon - - Pokémon Ultra Sun/Ultra Moon - - Pokémon Sword/Shield - - Pokémon Legends: Arceus - - Pokémon Scarlet/Violet - - Firel (Custom Ice Cave, Laboratory, Metropolis, Plains, Power Plant, Seabed, Space, and Volcano biome music) - - Lmz (Custom Ancient Ruins, Jungle, and Lake biome music) - - Andr06 (Custom Slum and Sea biome music) - -### 🎵 Sound Effects - - Pokémon Emerald - - Pokémon Black/White - -### 🎨 Backgrounds - - Squip (Paid Commissions) - - Contributions by Someonealive-QN - -### 🎨 UI - - GAMEFREAK - - LJ Birdman - -### 🎨 Pagefault Games Intro - - Spectremint - -### 🎨 Game Logo - - Gonstar (Paid Commission) - -### 🎨 Trainer Sprites - - GAMEFREAK (Pokémon Black/White 2, Pokémon Diamond/Pearl) - - kyledove - - Brumirage - - pkmn_realidea (Paid Commissions) - - IceJkai - -### 🎨 Trainer Portraits - - pkmn_realidea (Paid Commissions) - -### 🎨 Pokemon Sprites and Animation - - GAMEFREAK (Pokémon Black/White 2) - - Smogon Sprite Project (Various Artists) - - Skyflyer - - Nolo33 - - Ebaru - - EricLostie - - KingOfThe-X-Roads - - kiriaura - - Caruban - - Sopita_Yorita - - Azrita - - AshnixsLaw - - Hellfire0raptor - - RetroNC - - Franark122k - - OldSoulja - - PKMarioG - - ItsYugen - - lucasomi - - Pkm Sinfonia - - Poki Papillon - - Fleimer_ - - bizcoeindoloro - - mangalos810 - - Involuntary-Twitch - - selstar - - koda_want_to_sleep - -### 🎨 Move Animations - - Pokémon Reborn +Thank you to all the wonderful people that have contributed to the PokéRogue project! You can find the credits [here](./CREDITS.md). diff --git a/package-lock.json b/package-lock.json index 9d6e2440f44..a4568b3f5ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.2.2", + "version": "1.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.2.2", + "version": "1.3.0", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", @@ -16,6 +16,7 @@ "i18next-http-backend": "^2.6.1", "i18next-korean-postposition-processor": "^1.0.0", "json-stable-stringify": "^1.1.0", + "jszip": "^3.10.1", "phaser": "^3.70.0", "phaser3-rex-plugins": "^1.1.84" }, @@ -2723,6 +2724,11 @@ "node": ">= 0.6" } }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "node_modules/cross-fetch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", @@ -4045,6 +4051,11 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -4072,6 +4083,11 @@ "node": ">=0.8.19" } }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, "node_modules/ini": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", @@ -4481,6 +4497,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -4648,6 +4675,14 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", @@ -5237,6 +5272,11 @@ "dev": true, "license": "BlueOak-1.0.0" }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "node_modules/papaparse": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", @@ -5485,6 +5525,11 @@ "node": ">= 0.8.0" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -5551,6 +5596,25 @@ } ] }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "node_modules/rechoir": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", @@ -5741,6 +5805,11 @@ "tslib": "^2.1.0" } }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/safe-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", @@ -5800,6 +5869,11 @@ "node": ">= 0.4" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5917,6 +5991,14 @@ "dev": true, "license": "MIT" }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -6473,6 +6555,11 @@ "requires-port": "^1.0.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "node_modules/vite": { "version": "5.4.8", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", diff --git a/package.json b/package.json index ef2d4938087..a8641bb0b98 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.2.2", + "version": "1.3.0", "type": "module", "scripts": { "start": "vite", @@ -55,6 +55,7 @@ "i18next-http-backend": "^2.6.1", "i18next-korean-postposition-processor": "^1.0.0", "json-stable-stringify": "^1.1.0", + "jszip": "^3.10.1", "phaser": "^3.70.0", "phaser3-rex-plugins": "^1.1.84" }, diff --git a/public/audio/bgm/forest.mp3 b/public/audio/bgm/forest.mp3 index a1d9ecb4b28..6382d3fc0b2 100644 Binary files a/public/audio/bgm/forest.mp3 and b/public/audio/bgm/forest.mp3 differ diff --git a/public/battle-anims/common-powder.json b/public/battle-anims/common-powder.json new file mode 100644 index 00000000000..698d68e7e81 --- /dev/null +++ b/public/battle-anims/common-powder.json @@ -0,0 +1,2496 @@ +{ + "graphic":"PRAS- Powder", + "frames":[ + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 21, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 21, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 21, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 22, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 21, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 22, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 21, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 22, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 21, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 22, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 21, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 22, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 21, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 22, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":16, + "y":2, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 21, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 22, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 23, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":16, + "y":2, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 21, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 22, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 23, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":16, + "y":2, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 21, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 22, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":16, + "y":2, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 21, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 22, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":16, + "y":2, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 23, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 22, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 24, + "opacity": 0 , + "focus":2 + }, + { + "x":16, + "y":2, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 23, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 17, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":16, + "y":2, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 23, + "opacity": 0 , + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 24, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 18, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":16, + "y":2, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 17, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 24, + "opacity": 0, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 18, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":16, + "y":2, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 18, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 17, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 19, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 8, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":16, + "y":2, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 18, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 18, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 19, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 8, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":16, + "y":2, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 19, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 18, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 9, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":16, + "y":2, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 19, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":12, + "y":0, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 8, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 19, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 8, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 9, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":16, + "y":2, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 20, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":12, + "y":0, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 8, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 19, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 9, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 9, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":16, + "y":2, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 20, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":12, + "y":0, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 9, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 20, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 9, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 9, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":12, + "y":0, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 9, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 20, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 10, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 10, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":12, + "y":0, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 10, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 10, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 10, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":12, + "y":0, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 10, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 10, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 11, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":12, + "y":0, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 11, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 11, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 11, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":12, + "y":0, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 11, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 11, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 12, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":12, + "y":0, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 12, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 12, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 12, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":12, + "y":0, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 12, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 12, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 13, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":12, + "y":0, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 13, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 13, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 13, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":12, + "y":0, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 13, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 13, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 14, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":12, + "y":0, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 14, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 14, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 14, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":12, + "y":0, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 14, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 14, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 15, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":12, + "y":0, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 15, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 15, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 15, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":12, + "y":0, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 15, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 15, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 16, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":12, + "y":0, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 16, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 16, + "opacity": 255, + "priority": 1, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 16, + "opacity": 155, + "focus":2 + }, + { + "x":12, + "y":0, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 16, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 16, + "opacity": 150, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + }, + { + "x":-6, + "y":-3, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 16, + "opacity": 155, + "focus":2 + }, + { + "x":12, + "y":0, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 16, + "opacity": 255, + "priority": 1, + "focus":2 + }, + { + "x":-12, + "y":-20, + "zoomX":130, + "zoomY":120, + "visible":true, + "target": 2, + "graphicFrame": 16, + "opacity": 150, + "focus":2 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + } + ], + [ + { + "x":0, + "y":0, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":0, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":2 + }, + { + "x":128, + "y":-64, + "zoomX":100, + "zoomY":100, + "visible":true, + "target":1, + "graphicFrame":0, + "opacity": 255, + "locked": true, + "priority":1, + "focus":1 + } + ] + ], + "frameTimedEvents":{ + "16":[{"frameIndex":16,"resourceName":"PRSFX- Powder common1.wav","volume":100,"pitch":100,"eventType":"AnimTimedSoundEvent"}], + "18":[{"frameIndex":18,"resourceName":"PRSFX- Powder common2.wav","volume":30,"pitch":120,"eventType":"AnimTimedSoundEvent"}] + }, + "position":3, + "hue":0 +} \ No newline at end of file diff --git a/public/images/battle_anims/PRAS- Powder.png b/public/images/battle_anims/PRAS- Powder.png index 3c4a4d2db55..9656c31e6c9 100644 Binary files a/public/images/battle_anims/PRAS- Powder.png and b/public/images/battle_anims/PRAS- Powder.png differ diff --git a/public/images/pokemon/1003.png b/public/images/pokemon/1003.png index 3a88f39d65f..eb69527246d 100644 Binary files a/public/images/pokemon/1003.png and b/public/images/pokemon/1003.png differ diff --git a/public/images/pokemon/159.png b/public/images/pokemon/159.png index 62de85e4ad7..46073ff539c 100644 Binary files a/public/images/pokemon/159.png and b/public/images/pokemon/159.png differ diff --git a/public/images/pokemon/164.png b/public/images/pokemon/164.png index c172959d338..b5d83ad6818 100644 Binary files a/public/images/pokemon/164.png and b/public/images/pokemon/164.png differ diff --git a/public/images/pokemon/190.png b/public/images/pokemon/190.png index b049ba83296..40563cec158 100644 Binary files a/public/images/pokemon/190.png and b/public/images/pokemon/190.png differ diff --git a/public/images/pokemon/199.png b/public/images/pokemon/199.png index d3b072497bd..f2e8888fb2d 100644 Binary files a/public/images/pokemon/199.png and b/public/images/pokemon/199.png differ diff --git a/public/images/pokemon/218.png b/public/images/pokemon/218.png index aeb9a35f9fe..64faad88ba3 100644 Binary files a/public/images/pokemon/218.png and b/public/images/pokemon/218.png differ diff --git a/public/images/pokemon/226.png b/public/images/pokemon/226.png index dbc04cc885f..006bd465b05 100644 Binary files a/public/images/pokemon/226.png and b/public/images/pokemon/226.png differ diff --git a/public/images/pokemon/228.png b/public/images/pokemon/228.png index c601cc4058d..476aa4d619d 100644 Binary files a/public/images/pokemon/228.png and b/public/images/pokemon/228.png differ diff --git a/public/images/pokemon/229-mega.png b/public/images/pokemon/229-mega.png index ebcda7bf90a..fac79bad8c1 100644 Binary files a/public/images/pokemon/229-mega.png and b/public/images/pokemon/229-mega.png differ diff --git a/public/images/pokemon/229.png b/public/images/pokemon/229.png index 270f36e64eb..6439012bacf 100644 Binary files a/public/images/pokemon/229.png and b/public/images/pokemon/229.png differ diff --git a/public/images/pokemon/232.png b/public/images/pokemon/232.png index ac7ae0eb5ae..0bfb76be5ed 100644 Binary files a/public/images/pokemon/232.png and b/public/images/pokemon/232.png differ diff --git a/public/images/pokemon/25-cool-cosplay.png b/public/images/pokemon/25-cool-cosplay.png index 123ae257598..ba1e1145901 100644 Binary files a/public/images/pokemon/25-cool-cosplay.png and b/public/images/pokemon/25-cool-cosplay.png differ diff --git a/public/images/pokemon/256.png b/public/images/pokemon/256.png index beb509fa9de..2a071e76188 100644 Binary files a/public/images/pokemon/256.png and b/public/images/pokemon/256.png differ diff --git a/public/images/pokemon/257-mega.png b/public/images/pokemon/257-mega.png index 0350e97deee..51d700c3e9a 100644 Binary files a/public/images/pokemon/257-mega.png and b/public/images/pokemon/257-mega.png differ diff --git a/public/images/pokemon/257.png b/public/images/pokemon/257.png index 76cfb0490e8..77dbc705a60 100644 Binary files a/public/images/pokemon/257.png and b/public/images/pokemon/257.png differ diff --git a/public/images/pokemon/261.png b/public/images/pokemon/261.png index a519b9951a4..9e47128a545 100644 Binary files a/public/images/pokemon/261.png and b/public/images/pokemon/261.png differ diff --git a/public/images/pokemon/262.png b/public/images/pokemon/262.png index ee95836e908..71509b88626 100644 Binary files a/public/images/pokemon/262.png and b/public/images/pokemon/262.png differ diff --git a/public/images/pokemon/308.png b/public/images/pokemon/308.png index 20e41507efa..94dd021f209 100644 Binary files a/public/images/pokemon/308.png and b/public/images/pokemon/308.png differ diff --git a/public/images/pokemon/335.png b/public/images/pokemon/335.png index 87f8b341b55..e5d051dd850 100644 Binary files a/public/images/pokemon/335.png and b/public/images/pokemon/335.png differ diff --git a/public/images/pokemon/336.png b/public/images/pokemon/336.png index 5908f2b36a2..daf64440220 100644 Binary files a/public/images/pokemon/336.png and b/public/images/pokemon/336.png differ diff --git a/public/images/pokemon/357.png b/public/images/pokemon/357.png index ce003f24c41..6b1ed63c3fe 100644 Binary files a/public/images/pokemon/357.png and b/public/images/pokemon/357.png differ diff --git a/public/images/pokemon/370.png b/public/images/pokemon/370.png index c53d42f9cd3..e9f29872fb2 100644 Binary files a/public/images/pokemon/370.png and b/public/images/pokemon/370.png differ diff --git a/public/images/pokemon/373.png b/public/images/pokemon/373.png index e3f967583a5..5174907b69b 100644 Binary files a/public/images/pokemon/373.png and b/public/images/pokemon/373.png differ diff --git a/public/images/pokemon/401.png b/public/images/pokemon/401.png index fa3dd915202..f4fffa67e54 100644 Binary files a/public/images/pokemon/401.png and b/public/images/pokemon/401.png differ diff --git a/public/images/pokemon/402.png b/public/images/pokemon/402.png index a7808e446a6..15de8f02a0d 100644 Binary files a/public/images/pokemon/402.png and b/public/images/pokemon/402.png differ diff --git a/public/images/pokemon/4080.png b/public/images/pokemon/4080.png index 4af9ba7ea0d..2ad2193cdbc 100644 Binary files a/public/images/pokemon/4080.png and b/public/images/pokemon/4080.png differ diff --git a/public/images/pokemon/418.png b/public/images/pokemon/418.png index 005c917463f..fba2402c2b3 100644 Binary files a/public/images/pokemon/418.png and b/public/images/pokemon/418.png differ diff --git a/public/images/pokemon/419.png b/public/images/pokemon/419.png index 572f819749b..5fbe90ff3bd 100644 Binary files a/public/images/pokemon/419.png and b/public/images/pokemon/419.png differ diff --git a/public/images/pokemon/4199.png b/public/images/pokemon/4199.png index df9dee11cdb..9c9f86e1f5d 100644 Binary files a/public/images/pokemon/4199.png and b/public/images/pokemon/4199.png differ diff --git a/public/images/pokemon/424.png b/public/images/pokemon/424.png index d19a5a79e4a..c0bc59a0caa 100644 Binary files a/public/images/pokemon/424.png and b/public/images/pokemon/424.png differ diff --git a/public/images/pokemon/45.png b/public/images/pokemon/45.png index db9c8d9c3f2..1c6f5a5a9f2 100644 Binary files a/public/images/pokemon/45.png and b/public/images/pokemon/45.png differ diff --git a/public/images/pokemon/451.json b/public/images/pokemon/451.json index 0e99c96f876..6c266f21a24 100644 --- a/public/images/pokemon/451.json +++ b/public/images/pokemon/451.json @@ -1,2330 +1,715 @@ -{ - "textures": [ - { - "image": "451.png", - "format": "RGBA8888", - "size": { - "w": 281, - "h": 281 - }, - "scale": 1, - "frames": [ - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 69, - "h": 41 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 41 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 69, - "h": 41 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 41 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 69, - "h": 41 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 41 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 69, - "h": 41 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 43 - }, - "frame": { - "x": 69, - "y": 0, - "w": 63, - "h": 43 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 43 - }, - "frame": { - "x": 69, - "y": 0, - "w": 63, - "h": 43 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 43 - }, - "frame": { - "x": 69, - "y": 0, - "w": 63, - "h": 43 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 43 - }, - "frame": { - "x": 69, - "y": 0, - "w": 63, - "h": 43 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 43 - }, - "frame": { - "x": 69, - "y": 0, - "w": 63, - "h": 43 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 43 - }, - "frame": { - "x": 69, - "y": 0, - "w": 63, - "h": 43 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 43 - }, - "frame": { - "x": 69, - "y": 0, - "w": 63, - "h": 43 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 43 - }, - "frame": { - "x": 69, - "y": 0, - "w": 63, - "h": 43 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 66, - "h": 43 - }, - "frame": { - "x": 132, - "y": 0, - "w": 66, - "h": 43 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 66, - "h": 43 - }, - "frame": { - "x": 132, - "y": 0, - "w": 66, - "h": 43 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 66, - "h": 43 - }, - "frame": { - "x": 132, - "y": 0, - "w": 66, - "h": 43 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 66, - "h": 43 - }, - "frame": { - "x": 132, - "y": 0, - "w": 66, - "h": 43 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 65, - "h": 43 - }, - "frame": { - "x": 198, - "y": 0, - "w": 65, - "h": 43 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 65, - "h": 43 - }, - "frame": { - "x": 198, - "y": 0, - "w": 65, - "h": 43 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 65, - "h": 43 - }, - "frame": { - "x": 198, - "y": 0, - "w": 65, - "h": 43 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 65, - "h": 43 - }, - "frame": { - "x": 198, - "y": 0, - "w": 65, - "h": 43 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 65, - "h": 43 - }, - "frame": { - "x": 0, - "y": 41, - "w": 65, - "h": 43 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 65, - "h": 43 - }, - "frame": { - "x": 0, - "y": 41, - "w": 65, - "h": 43 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 65, - "h": 43 - }, - "frame": { - "x": 0, - "y": 41, - "w": 65, - "h": 43 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 65, - "h": 43 - }, - "frame": { - "x": 0, - "y": 41, - "w": 65, - "h": 43 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 44 - }, - "frame": { - "x": 65, - "y": 43, - "w": 61, - "h": 44 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 44 - }, - "frame": { - "x": 65, - "y": 43, - "w": 61, - "h": 44 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 44 - }, - "frame": { - "x": 65, - "y": 43, - "w": 61, - "h": 44 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 44 - }, - "frame": { - "x": 65, - "y": 43, - "w": 61, - "h": 44 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 44 - }, - "frame": { - "x": 65, - "y": 43, - "w": 61, - "h": 44 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 44 - }, - "frame": { - "x": 65, - "y": 43, - "w": 61, - "h": 44 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 44 - }, - "frame": { - "x": 65, - "y": 43, - "w": 61, - "h": 44 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 44 - }, - "frame": { - "x": 65, - "y": 43, - "w": 61, - "h": 44 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 62, - "h": 44 - }, - "frame": { - "x": 126, - "y": 43, - "w": 62, - "h": 44 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 62, - "h": 44 - }, - "frame": { - "x": 126, - "y": 43, - "w": 62, - "h": 44 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 62, - "h": 44 - }, - "frame": { - "x": 126, - "y": 43, - "w": 62, - "h": 44 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 62, - "h": 44 - }, - "frame": { - "x": 126, - "y": 43, - "w": 62, - "h": 44 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 63, - "h": 44 - }, - "frame": { - "x": 188, - "y": 43, - "w": 63, - "h": 44 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 63, - "h": 44 - }, - "frame": { - "x": 188, - "y": 43, - "w": 63, - "h": 44 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 63, - "h": 44 - }, - "frame": { - "x": 188, - "y": 43, - "w": 63, - "h": 44 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 63, - "h": 44 - }, - "frame": { - "x": 188, - "y": 43, - "w": 63, - "h": 44 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 0, - "y": 84, - "w": 59, - "h": 45 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 0, - "y": 84, - "w": 59, - "h": 45 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 0, - "y": 84, - "w": 59, - "h": 45 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 0, - "y": 84, - "w": 59, - "h": 45 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 0, - "y": 84, - "w": 59, - "h": 45 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 0, - "y": 84, - "w": 59, - "h": 45 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 0, - "y": 84, - "w": 59, - "h": 45 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 0, - "y": 84, - "w": 59, - "h": 45 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 59, - "y": 87, - "w": 59, - "h": 45 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 59, - "y": 87, - "w": 59, - "h": 45 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 59, - "y": 87, - "w": 59, - "h": 45 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 59, - "y": 87, - "w": 59, - "h": 45 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 61, - "h": 45 - }, - "frame": { - "x": 118, - "y": 87, - "w": 61, - "h": 45 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 61, - "h": 45 - }, - "frame": { - "x": 118, - "y": 87, - "w": 61, - "h": 45 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 61, - "h": 45 - }, - "frame": { - "x": 118, - "y": 87, - "w": 61, - "h": 45 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 61, - "h": 45 - }, - "frame": { - "x": 118, - "y": 87, - "w": 61, - "h": 45 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 57, - "h": 45 - }, - "frame": { - "x": 179, - "y": 87, - "w": 57, - "h": 45 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 57, - "h": 45 - }, - "frame": { - "x": 179, - "y": 87, - "w": 57, - "h": 45 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 57, - "h": 45 - }, - "frame": { - "x": 0, - "y": 129, - "w": 57, - "h": 45 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 57, - "h": 45 - }, - "frame": { - "x": 0, - "y": 129, - "w": 57, - "h": 45 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 57, - "h": 45 - }, - "frame": { - "x": 57, - "y": 132, - "w": 57, - "h": 45 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 57, - "h": 45 - }, - "frame": { - "x": 57, - "y": 132, - "w": 57, - "h": 45 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 56, - "h": 45 - }, - "frame": { - "x": 114, - "y": 132, - "w": 56, - "h": 45 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 56, - "h": 45 - }, - "frame": { - "x": 114, - "y": 132, - "w": 56, - "h": 45 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 54, - "h": 45 - }, - "frame": { - "x": 170, - "y": 132, - "w": 54, - "h": 45 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 54, - "h": 45 - }, - "frame": { - "x": 170, - "y": 132, - "w": 54, - "h": 45 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 54, - "h": 45 - }, - "frame": { - "x": 224, - "y": 132, - "w": 54, - "h": 45 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 54, - "h": 45 - }, - "frame": { - "x": 224, - "y": 132, - "w": 54, - "h": 45 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 111, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 111, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 111, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 111, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 60, - "h": 46 - }, - "frame": { - "x": 168, - "y": 177, - "w": 60, - "h": 46 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 60, - "h": 46 - }, - "frame": { - "x": 168, - "y": 177, - "w": 60, - "h": 46 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 60, - "h": 46 - }, - "frame": { - "x": 168, - "y": 177, - "w": 60, - "h": 46 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 60, - "h": 46 - }, - "frame": { - "x": 168, - "y": 177, - "w": 60, - "h": 46 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 228, - "y": 177, - "w": 53, - "h": 46 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 228, - "y": 177, - "w": 53, - "h": 46 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 220, - "w": 54, - "h": 46 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 220, - "w": 54, - "h": 46 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 223, - "w": 57, - "h": 46 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 223, - "w": 57, - "h": 46 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 223, - "w": 57, - "h": 46 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 223, - "w": 57, - "h": 46 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 55, - "h": 46 - }, - "frame": { - "x": 111, - "y": 223, - "w": 55, - "h": 46 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 55, - "h": 46 - }, - "frame": { - "x": 111, - "y": 223, - "w": 55, - "h": 46 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 55, - "h": 46 - }, - "frame": { - "x": 166, - "y": 223, - "w": 55, - "h": 46 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 55, - "h": 46 - }, - "frame": { - "x": 166, - "y": 223, - "w": 55, - "h": 46 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 221, - "y": 223, - "w": 54, - "h": 46 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 221, - "y": 223, - "w": 54, - "h": 46 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e303c68c1876b77078f3e1fd4372a4ce:84139d6b94cea0f3c45dbd8fa7109c3d:c79e17c206de27e3b7f1ce96f7df8e51$" - } -} +{ "frames": [ + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 68, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 68, "h": 40 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0001.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0002.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0003.png", + "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0004.png", + "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0007.png", + "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0008.png", + "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0009.png", + "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0010.png", + "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0011.png", + "frame": { "x": 68, "y": 0, "w": 64, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 64, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0012.png", + "frame": { "x": 68, "y": 0, "w": 64, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 64, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0013.png", + "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0014.png", + "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0015.png", + "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0016.png", + "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0019.png", + "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0020.png", + "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0021.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0022.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0023.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0024.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0025.png", + "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0026.png", + "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0029.png", + "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0030.png", + "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0031.png", + "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0032.png", + "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0033.png", + "frame": { "x": 68, "y": 0, "w": 64, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 64, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0034.png", + "frame": { "x": 68, "y": 0, "w": 64, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 64, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0035.png", + "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0036.png", + "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0037.png", + "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0038.png", + "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0041.png", + "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0042.png", + "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0043.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0044.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0045.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0046.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0047.png", + "frame": { "x": 232, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0048.png", + "frame": { "x": 232, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0049.png", + "frame": { "x": 117, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0050.png", + "frame": { "x": 117, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0051.png", + "frame": { "x": 117, "y": 42, "w": 60, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 60, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0052.png", + "frame": { "x": 117, "y": 42, "w": 60, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 60, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0053.png", + "frame": { "x": 132, "y": 0, "w": 63, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 63, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0054.png", + "frame": { "x": 132, "y": 0, "w": 63, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 63, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 68, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 68, "h": 40 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0057.png", + "frame": { "x": 195, "y": 0, "w": 63, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 63, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0058.png", + "frame": { "x": 195, "y": 0, "w": 63, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 63, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0059.png", + "frame": { "x": 258, "y": 0, "w": 61, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 61, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0060.png", + "frame": { "x": 258, "y": 0, "w": 61, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 61, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0061.png", + "frame": { "x": 58, "y": 42, "w": 59, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 59, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0062.png", + "frame": { "x": 58, "y": 42, "w": 59, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 59, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 40, "w": 58, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 58, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0064.png", + "frame": { "x": 0, "y": 40, "w": 58, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 58, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0065.png", + "frame": { "x": 177, "y": 84, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 55, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0066.png", + "frame": { "x": 177, "y": 84, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 55, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 129, "w": 55, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 55, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 129, "w": 55, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 55, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0069.png", + "frame": { "x": 112, "y": 129, "w": 55, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 55, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0070.png", + "frame": { "x": 112, "y": 129, "w": 55, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 55, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0071.png", + "frame": { "x": 167, "y": 130, "w": 55, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 55, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0072.png", + "frame": { "x": 167, "y": 130, "w": 55, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 55, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 173, "w": 54, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 54, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 173, "w": 54, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 54, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0075.png", + "frame": { "x": 54, "y": 177, "w": 52, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 52, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0076.png", + "frame": { "x": 54, "y": 177, "w": 52, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 52, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0077.png", + "frame": { "x": 210, "y": 176, "w": 53, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 53, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0078.png", + "frame": { "x": 210, "y": 176, "w": 53, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 53, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0079.png", + "frame": { "x": 158, "y": 174, "w": 52, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 52, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0080.png", + "frame": { "x": 158, "y": 174, "w": 52, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 52, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0081.png", + "frame": { "x": 222, "y": 131, "w": 53, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 53, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0082.png", + "frame": { "x": 222, "y": 131, "w": 53, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 53, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0083.png", + "frame": { "x": 275, "y": 132, "w": 53, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 53, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0084.png", + "frame": { "x": 275, "y": 132, "w": 53, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 53, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0085.png", + "frame": { "x": 55, "y": 131, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0086.png", + "frame": { "x": 55, "y": 131, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0087.png", + "frame": { "x": 107, "y": 173, "w": 51, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 51, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0088.png", + "frame": { "x": 107, "y": 173, "w": 51, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 51, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.8.1-x64", + "image": "451.png", + "format": "I8", + "size": { "w": 339, "h": 221 }, + "scale": "1" + } +} \ No newline at end of file diff --git a/public/images/pokemon/451.png b/public/images/pokemon/451.png index fac8f5a0170..716e8a08041 100644 Binary files a/public/images/pokemon/451.png and b/public/images/pokemon/451.png differ diff --git a/public/images/pokemon/456.png b/public/images/pokemon/456.png index 4b6c8c4e52f..501eb5904fe 100644 Binary files a/public/images/pokemon/456.png and b/public/images/pokemon/456.png differ diff --git a/public/images/pokemon/4562.png b/public/images/pokemon/4562.png index 1165444cc50..b08f724ab8b 100644 Binary files a/public/images/pokemon/4562.png and b/public/images/pokemon/4562.png differ diff --git a/public/images/pokemon/457.png b/public/images/pokemon/457.png index 6ee49243598..07425b2a147 100644 Binary files a/public/images/pokemon/457.png and b/public/images/pokemon/457.png differ diff --git a/public/images/pokemon/467.png b/public/images/pokemon/467.png index a22d045f925..ec7039932d1 100644 Binary files a/public/images/pokemon/467.png and b/public/images/pokemon/467.png differ diff --git a/public/images/pokemon/47.json b/public/images/pokemon/47.json index 437459a66e9..959bfe740f7 100644 --- a/public/images/pokemon/47.json +++ b/public/images/pokemon/47.json @@ -1,776 +1,299 @@ -{ - "textures": [ - { - "image": "47.png", - "format": "RGBA8888", - "size": { - "w": 230, - "h": 230 - }, - "scale": 1, - "frames": [ - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 6, - "y": 12, - "w": 56, - "h": 49 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 49 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 6, - "y": 12, - "w": 56, - "h": 49 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 49 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 62, - "h": 51 - }, - "frame": { - "x": 56, - "y": 0, - "w": 62, - "h": 51 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 62, - "h": 51 - }, - "frame": { - "x": 56, - "y": 0, - "w": 62, - "h": 51 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 7, - "y": 8, - "w": 55, - "h": 53 - }, - "frame": { - "x": 118, - "y": 0, - "w": 55, - "h": 53 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 7, - "y": 8, - "w": 55, - "h": 53 - }, - "frame": { - "x": 118, - "y": 0, - "w": 55, - "h": 53 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 55, - "h": 54 - }, - "frame": { - "x": 173, - "y": 0, - "w": 55, - "h": 54 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 55, - "h": 54 - }, - "frame": { - "x": 173, - "y": 0, - "w": 55, - "h": 54 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 49, - "w": 53, - "h": 56 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 49, - "w": 53, - "h": 56 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 62, - "h": 55 - }, - "frame": { - "x": 53, - "y": 51, - "w": 62, - "h": 55 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 62, - "h": 55 - }, - "frame": { - "x": 53, - "y": 51, - "w": 62, - "h": 55 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 53, - "h": 57 - }, - "frame": { - "x": 115, - "y": 53, - "w": 53, - "h": 57 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 53, - "h": 57 - }, - "frame": { - "x": 115, - "y": 53, - "w": 53, - "h": 57 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 62, - "h": 56 - }, - "frame": { - "x": 168, - "y": 54, - "w": 62, - "h": 56 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 62, - "h": 56 - }, - "frame": { - "x": 168, - "y": 54, - "w": 62, - "h": 56 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 61, - "h": 58 - }, - "frame": { - "x": 0, - "y": 106, - "w": 61, - "h": 58 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 61, - "h": 58 - }, - "frame": { - "x": 0, - "y": 106, - "w": 61, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 54, - "h": 59 - }, - "frame": { - "x": 61, - "y": 106, - "w": 54, - "h": 59 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 54, - "h": 59 - }, - "frame": { - "x": 61, - "y": 106, - "w": 54, - "h": 59 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 57, - "h": 59 - }, - "frame": { - "x": 115, - "y": 110, - "w": 57, - "h": 59 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 57, - "h": 59 - }, - "frame": { - "x": 115, - "y": 110, - "w": 57, - "h": 59 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 57, - "h": 59 - }, - "frame": { - "x": 115, - "y": 110, - "w": 57, - "h": 59 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 57, - "h": 59 - }, - "frame": { - "x": 115, - "y": 110, - "w": 57, - "h": 59 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 54, - "h": 59 - }, - "frame": { - "x": 172, - "y": 110, - "w": 54, - "h": 59 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 54, - "h": 59 - }, - "frame": { - "x": 172, - "y": 110, - "w": 54, - "h": 59 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 61, - "h": 59 - }, - "frame": { - "x": 0, - "y": 164, - "w": 61, - "h": 59 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 61, - "h": 59 - }, - "frame": { - "x": 0, - "y": 164, - "w": 61, - "h": 59 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 57, - "h": 61 - }, - "frame": { - "x": 61, - "y": 169, - "w": 57, - "h": 61 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 57, - "h": 61 - }, - "frame": { - "x": 61, - "y": 169, - "w": 57, - "h": 61 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 57, - "h": 61 - }, - "frame": { - "x": 61, - "y": 169, - "w": 57, - "h": 61 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 57, - "h": 61 - }, - "frame": { - "x": 61, - "y": 169, - "w": 57, - "h": 61 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 61 - }, - "frame": { - "x": 118, - "y": 169, - "w": 60, - "h": 61 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 61 - }, - "frame": { - "x": 118, - "y": 169, - "w": 60, - "h": 61 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 61 - }, - "frame": { - "x": 118, - "y": 169, - "w": 60, - "h": 61 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 61 - }, - "frame": { - "x": 118, - "y": 169, - "w": 60, - "h": 61 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b28fe643197bcc1def0e0ac2ba9f4e67:516d08c8e1ff13b49a109b082ef12860:fe45e2d628a6cef0908f7b82468c8798$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 58, "w": 55, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 55, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 58, "w": 55, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 55, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0003.png", + "frame": { "x": 166, "y": 114, "w": 52, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 52, "h": 56 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0004.png", + "frame": { "x": 166, "y": 114, "w": 52, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 52, "h": 56 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 169, "w": 51, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 51, "h": 54 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 169, "w": 51, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 51, "h": 54 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0007.png", + "frame": { "x": 104, "y": 166, "w": 53, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 9, "w": 53, "h": 52 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0008.png", + "frame": { "x": 104, "y": 166, "w": 53, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 9, "w": 53, "h": 52 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0009.png", + "frame": { "x": 157, "y": 170, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 55, "h": 49 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0010.png", + "frame": { "x": 157, "y": 170, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 55, "h": 49 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 115, "w": 53, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 53, "h": 54 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 115, "w": 53, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 53, "h": 54 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0013.png", + "frame": { "x": 53, "y": 116, "w": 51, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 51, "h": 56 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0014.png", + "frame": { "x": 53, "y": 116, "w": 51, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 51, "h": 56 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0015.png", + "frame": { "x": 114, "y": 109, "w": 52, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 52, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0016.png", + "frame": { "x": 114, "y": 109, "w": 52, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 52, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0017.png", + "frame": { "x": 59, "y": 57, "w": 55, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 55, "h": 59 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0018.png", + "frame": { "x": 59, "y": 57, "w": 55, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 55, "h": 59 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 58, "w": 55, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 55, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 58, "w": 55, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 55, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0021.png", + "frame": { "x": 178, "y": 56, "w": 57, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 57, "h": 58 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0022.png", + "frame": { "x": 178, "y": 56, "w": 57, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 57, "h": 58 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0023.png", + "frame": { "x": 119, "y": 0, "w": 59, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 59, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0024.png", + "frame": { "x": 119, "y": 0, "w": 59, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 59, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0025.png", + "frame": { "x": 178, "y": 0, "w": 60, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 60, "h": 56 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0026.png", + "frame": { "x": 178, "y": 0, "w": 60, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 60, "h": 56 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0027.png", + "frame": { "x": 114, "y": 57, "w": 62, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 12, "w": 62, "h": 52 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0028.png", + "frame": { "x": 114, "y": 57, "w": 62, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 12, "w": 62, "h": 52 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0029.png", + "frame": { "x": 59, "y": 0, "w": 60, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 60, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0030.png", + "frame": { "x": 59, "y": 0, "w": 60, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 60, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 0, "w": 59, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 59, "h": 58 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 0, "w": 59, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 59, "h": 58 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0033.png", + "frame": { "x": 178, "y": 56, "w": 57, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 57, "h": 58 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0034.png", + "frame": { "x": 178, "y": 56, "w": 57, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 57, "h": 58 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0035.png", + "frame": { "x": 59, "y": 57, "w": 55, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 55, "h": 59 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0036.png", + "frame": { "x": 59, "y": 57, "w": 55, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 55, "h": 59 }, + "sourceSize": { "w": 65, "h": 65 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.8.1-x64", + "image": "47.png", + "format": "I8", + "size": { "w": 238, "h": 223 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/47.png b/public/images/pokemon/47.png index f9474fda1c9..665cabf322e 100644 Binary files a/public/images/pokemon/47.png and b/public/images/pokemon/47.png differ diff --git a/public/images/pokemon/531-mega.png b/public/images/pokemon/531-mega.png index 4e692979402..f08cc04b51c 100644 Binary files a/public/images/pokemon/531-mega.png and b/public/images/pokemon/531-mega.png differ diff --git a/public/images/pokemon/669-blue.png b/public/images/pokemon/669-blue.png index 5cdefbbae6b..85426c58d51 100644 Binary files a/public/images/pokemon/669-blue.png and b/public/images/pokemon/669-blue.png differ diff --git a/public/images/pokemon/669-orange.png b/public/images/pokemon/669-orange.png index 6d93c5b13b8..565301b795b 100644 Binary files a/public/images/pokemon/669-orange.png and b/public/images/pokemon/669-orange.png differ diff --git a/public/images/pokemon/669-red.png b/public/images/pokemon/669-red.png index 02d89f59c31..b6219100729 100644 Binary files a/public/images/pokemon/669-red.png and b/public/images/pokemon/669-red.png differ diff --git a/public/images/pokemon/669-white.png b/public/images/pokemon/669-white.png index b815b86c5f5..a2809abf193 100644 Binary files a/public/images/pokemon/669-white.png and b/public/images/pokemon/669-white.png differ diff --git a/public/images/pokemon/669-yellow.png b/public/images/pokemon/669-yellow.png index 517406798e7..c3ad0eff812 100644 Binary files a/public/images/pokemon/669-yellow.png and b/public/images/pokemon/669-yellow.png differ diff --git a/public/images/pokemon/670-blue.png b/public/images/pokemon/670-blue.png index b70ec5532f9..4359006fe78 100644 Binary files a/public/images/pokemon/670-blue.png and b/public/images/pokemon/670-blue.png differ diff --git a/public/images/pokemon/670-orange.png b/public/images/pokemon/670-orange.png index 9beb7d884d5..d5c10c4c40b 100644 Binary files a/public/images/pokemon/670-orange.png and b/public/images/pokemon/670-orange.png differ diff --git a/public/images/pokemon/670-red.png b/public/images/pokemon/670-red.png index 9452ba90968..0ac18083828 100644 Binary files a/public/images/pokemon/670-red.png and b/public/images/pokemon/670-red.png differ diff --git a/public/images/pokemon/670-white.png b/public/images/pokemon/670-white.png index dba946ff47a..e8894d4f668 100644 Binary files a/public/images/pokemon/670-white.png and b/public/images/pokemon/670-white.png differ diff --git a/public/images/pokemon/670-yellow.png b/public/images/pokemon/670-yellow.png index 2d028fe5b1a..4803acafcb5 100644 Binary files a/public/images/pokemon/670-yellow.png and b/public/images/pokemon/670-yellow.png differ diff --git a/public/images/pokemon/671-blue.png b/public/images/pokemon/671-blue.png index ccbd88bb0b8..b384058bee9 100644 Binary files a/public/images/pokemon/671-blue.png and b/public/images/pokemon/671-blue.png differ diff --git a/public/images/pokemon/671-orange.png b/public/images/pokemon/671-orange.png index a99b8302e76..ac60adbcf10 100644 Binary files a/public/images/pokemon/671-orange.png and b/public/images/pokemon/671-orange.png differ diff --git a/public/images/pokemon/671-red.png b/public/images/pokemon/671-red.png index 460dafd4cc1..1b83ecf38ca 100644 Binary files a/public/images/pokemon/671-red.png and b/public/images/pokemon/671-red.png differ diff --git a/public/images/pokemon/671-white.png b/public/images/pokemon/671-white.png index 3d6f0d841b8..393970614d6 100644 Binary files a/public/images/pokemon/671-white.png and b/public/images/pokemon/671-white.png differ diff --git a/public/images/pokemon/671-yellow.png b/public/images/pokemon/671-yellow.png index 650e8db7a35..2af1b4aa543 100644 Binary files a/public/images/pokemon/671-yellow.png and b/public/images/pokemon/671-yellow.png differ diff --git a/public/images/pokemon/677.png b/public/images/pokemon/677.png index d0ebc245b32..3a5d6833ced 100644 Binary files a/public/images/pokemon/677.png and b/public/images/pokemon/677.png differ diff --git a/public/images/pokemon/678-female.png b/public/images/pokemon/678-female.png index 73abb68900a..087c5301dd0 100644 Binary files a/public/images/pokemon/678-female.png and b/public/images/pokemon/678-female.png differ diff --git a/public/images/pokemon/678.png b/public/images/pokemon/678.png index 7846bebd294..e4a1f8854fb 100644 Binary files a/public/images/pokemon/678.png and b/public/images/pokemon/678.png differ diff --git a/public/images/pokemon/698.png b/public/images/pokemon/698.png index 81c7b03e375..2e00f5693a6 100644 Binary files a/public/images/pokemon/698.png and b/public/images/pokemon/698.png differ diff --git a/public/images/pokemon/699.png b/public/images/pokemon/699.png index c8b7dda83ba..2d5320b71a2 100644 Binary files a/public/images/pokemon/699.png and b/public/images/pokemon/699.png differ diff --git a/public/images/pokemon/702.png b/public/images/pokemon/702.png index 0e3daf90889..4e0eccee204 100644 Binary files a/public/images/pokemon/702.png and b/public/images/pokemon/702.png differ diff --git a/public/images/pokemon/715.png b/public/images/pokemon/715.png index a13b8f435e4..e173bfe25ff 100644 Binary files a/public/images/pokemon/715.png and b/public/images/pokemon/715.png differ diff --git a/public/images/pokemon/716-active.png b/public/images/pokemon/716-active.png index 50b69e5ba7d..55ad63f4d3d 100644 Binary files a/public/images/pokemon/716-active.png and b/public/images/pokemon/716-active.png differ diff --git a/public/images/pokemon/716-neutral.png b/public/images/pokemon/716-neutral.png index 62a90a55dd1..8390dddffdc 100644 Binary files a/public/images/pokemon/716-neutral.png and b/public/images/pokemon/716-neutral.png differ diff --git a/public/images/pokemon/772.png b/public/images/pokemon/772.png index a32fd5c1b72..129e12d1e4c 100644 Binary files a/public/images/pokemon/772.png and b/public/images/pokemon/772.png differ diff --git a/public/images/pokemon/777.png b/public/images/pokemon/777.png index 074df4db673..bf1779d0f10 100644 Binary files a/public/images/pokemon/777.png and b/public/images/pokemon/777.png differ diff --git a/public/images/pokemon/778-disguised.png b/public/images/pokemon/778-disguised.png index 97397e9414c..b048cf02233 100644 Binary files a/public/images/pokemon/778-disguised.png and b/public/images/pokemon/778-disguised.png differ diff --git a/public/images/pokemon/80-mega.png b/public/images/pokemon/80-mega.png index 42aed7b3c66..6f7e9f0d962 100644 Binary files a/public/images/pokemon/80-mega.png and b/public/images/pokemon/80-mega.png differ diff --git a/public/images/pokemon/80.png b/public/images/pokemon/80.png index c6120f8b0b1..bcea1acb9b7 100644 Binary files a/public/images/pokemon/80.png and b/public/images/pokemon/80.png differ diff --git a/public/images/pokemon/818-gigantamax.png b/public/images/pokemon/818-gigantamax.png index c103073e4cf..c19add87a4f 100644 Binary files a/public/images/pokemon/818-gigantamax.png and b/public/images/pokemon/818-gigantamax.png differ diff --git a/public/images/pokemon/862.png b/public/images/pokemon/862.png index 4d6daf0a7da..3d82d7ef07a 100644 Binary files a/public/images/pokemon/862.png and b/public/images/pokemon/862.png differ diff --git a/public/images/pokemon/876-female.png b/public/images/pokemon/876-female.png index db4d869c148..3294cfc5b21 100644 Binary files a/public/images/pokemon/876-female.png and b/public/images/pokemon/876-female.png differ diff --git a/public/images/pokemon/876.png b/public/images/pokemon/876.png index a204d67325b..ae5a23d3d94 100644 Binary files a/public/images/pokemon/876.png and b/public/images/pokemon/876.png differ diff --git a/public/images/pokemon/881.png b/public/images/pokemon/881.png index 01cc12c00dd..321e2962b8b 100644 Binary files a/public/images/pokemon/881.png and b/public/images/pokemon/881.png differ diff --git a/public/images/pokemon/896.png b/public/images/pokemon/896.png index 1b64f2641a3..8157c737363 100644 Binary files a/public/images/pokemon/896.png and b/public/images/pokemon/896.png differ diff --git a/public/images/pokemon/898-ice.png b/public/images/pokemon/898-ice.png index 3723a78f33a..ebbe798f696 100644 Binary files a/public/images/pokemon/898-ice.png and b/public/images/pokemon/898-ice.png differ diff --git a/public/images/pokemon/898-shadow.png b/public/images/pokemon/898-shadow.png index 30bdbe224ec..cf6e79c1794 100644 Binary files a/public/images/pokemon/898-shadow.png and b/public/images/pokemon/898-shadow.png differ diff --git a/public/images/pokemon/898.png b/public/images/pokemon/898.png index d20e1f937e1..6966777e821 100644 Binary files a/public/images/pokemon/898.png and b/public/images/pokemon/898.png differ diff --git a/public/images/pokemon/912.png b/public/images/pokemon/912.png index 60b288d350e..022a653212c 100644 Binary files a/public/images/pokemon/912.png and b/public/images/pokemon/912.png differ diff --git a/public/images/pokemon/913.png b/public/images/pokemon/913.png index 7baef852807..328b48ff47b 100644 Binary files a/public/images/pokemon/913.png and b/public/images/pokemon/913.png differ diff --git a/public/images/pokemon/914.png b/public/images/pokemon/914.png index a2a89748c90..4e044dfae23 100644 Binary files a/public/images/pokemon/914.png and b/public/images/pokemon/914.png differ diff --git a/public/images/pokemon/940.png b/public/images/pokemon/940.png index f35482bb36a..434afc4a180 100644 Binary files a/public/images/pokemon/940.png and b/public/images/pokemon/940.png differ diff --git a/public/images/pokemon/941.png b/public/images/pokemon/941.png index 417d7923296..bbe885fd7b1 100644 Binary files a/public/images/pokemon/941.png and b/public/images/pokemon/941.png differ diff --git a/public/images/pokemon/981.png b/public/images/pokemon/981.png index ff66259c58d..b0f4a16498e 100644 Binary files a/public/images/pokemon/981.png and b/public/images/pokemon/981.png differ diff --git a/public/images/pokemon/997.png b/public/images/pokemon/997.png index 6b9248d85a3..5fee59edad6 100644 Binary files a/public/images/pokemon/997.png and b/public/images/pokemon/997.png differ diff --git a/public/images/pokemon/back/1003.png b/public/images/pokemon/back/1003.png index 77ece80dcc9..36ee14788b3 100644 Binary files a/public/images/pokemon/back/1003.png and b/public/images/pokemon/back/1003.png differ diff --git a/public/images/pokemon/back/126.png b/public/images/pokemon/back/126.png index 4b65d1323c8..193c38f7e2c 100644 Binary files a/public/images/pokemon/back/126.png and b/public/images/pokemon/back/126.png differ diff --git a/public/images/pokemon/back/159.png b/public/images/pokemon/back/159.png index 710014bf180..699661bb510 100644 Binary files a/public/images/pokemon/back/159.png and b/public/images/pokemon/back/159.png differ diff --git a/public/images/pokemon/back/190.png b/public/images/pokemon/back/190.png index bc4a5eee405..687eb29a67f 100644 Binary files a/public/images/pokemon/back/190.png and b/public/images/pokemon/back/190.png differ diff --git a/public/images/pokemon/back/199.png b/public/images/pokemon/back/199.png index 099dffb2a61..a7cffbc7820 100644 Binary files a/public/images/pokemon/back/199.png and b/public/images/pokemon/back/199.png differ diff --git a/public/images/pokemon/back/228.png b/public/images/pokemon/back/228.png index e723a44c31e..3a1952f81e7 100644 Binary files a/public/images/pokemon/back/228.png and b/public/images/pokemon/back/228.png differ diff --git a/public/images/pokemon/back/229-mega.png b/public/images/pokemon/back/229-mega.png index 6e09a3ae218..2c13a17ccc1 100644 Binary files a/public/images/pokemon/back/229-mega.png and b/public/images/pokemon/back/229-mega.png differ diff --git a/public/images/pokemon/back/229.png b/public/images/pokemon/back/229.png index 6cdef1e4d79..08692a9babe 100644 Binary files a/public/images/pokemon/back/229.png and b/public/images/pokemon/back/229.png differ diff --git a/public/images/pokemon/back/25-gigantamax.png b/public/images/pokemon/back/25-gigantamax.png index c80b3d5d486..1bed545d749 100644 Binary files a/public/images/pokemon/back/25-gigantamax.png and b/public/images/pokemon/back/25-gigantamax.png differ diff --git a/public/images/pokemon/back/256.png b/public/images/pokemon/back/256.png index 86f771dee3f..9e58466f2ba 100644 Binary files a/public/images/pokemon/back/256.png and b/public/images/pokemon/back/256.png differ diff --git a/public/images/pokemon/back/257-mega.png b/public/images/pokemon/back/257-mega.png index 1222c1cf8e2..df1f65d5811 100644 Binary files a/public/images/pokemon/back/257-mega.png and b/public/images/pokemon/back/257-mega.png differ diff --git a/public/images/pokemon/back/257.png b/public/images/pokemon/back/257.png index cc319ea4841..0104c4799da 100644 Binary files a/public/images/pokemon/back/257.png and b/public/images/pokemon/back/257.png differ diff --git a/public/images/pokemon/back/261.png b/public/images/pokemon/back/261.png index ce8d9579465..b44a6dc019e 100644 Binary files a/public/images/pokemon/back/261.png and b/public/images/pokemon/back/261.png differ diff --git a/public/images/pokemon/back/262.png b/public/images/pokemon/back/262.png index e1c7a26e2e8..2bc9bf59816 100644 Binary files a/public/images/pokemon/back/262.png and b/public/images/pokemon/back/262.png differ diff --git a/public/images/pokemon/back/303-mega.png b/public/images/pokemon/back/303-mega.png index c1fe85b22ff..94960dc84b1 100644 Binary files a/public/images/pokemon/back/303-mega.png and b/public/images/pokemon/back/303-mega.png differ diff --git a/public/images/pokemon/back/357.png b/public/images/pokemon/back/357.png index 4c832d552a9..7a7e551c4a2 100644 Binary files a/public/images/pokemon/back/357.png and b/public/images/pokemon/back/357.png differ diff --git a/public/images/pokemon/back/401.png b/public/images/pokemon/back/401.png index 61baacef0b6..1227e0533e3 100644 Binary files a/public/images/pokemon/back/401.png and b/public/images/pokemon/back/401.png differ diff --git a/public/images/pokemon/back/402.png b/public/images/pokemon/back/402.png index 68d74ba524d..f74de4e8dc2 100644 Binary files a/public/images/pokemon/back/402.png and b/public/images/pokemon/back/402.png differ diff --git a/public/images/pokemon/back/4080.png b/public/images/pokemon/back/4080.png index ce3c9cbd3f5..182424bd1e0 100644 Binary files a/public/images/pokemon/back/4080.png and b/public/images/pokemon/back/4080.png differ diff --git a/public/images/pokemon/back/412-sandy.png b/public/images/pokemon/back/412-sandy.png index c76152b11bc..61219669129 100644 Binary files a/public/images/pokemon/back/412-sandy.png and b/public/images/pokemon/back/412-sandy.png differ diff --git a/public/images/pokemon/back/418.png b/public/images/pokemon/back/418.png index 5d2cf6c1368..724948d9809 100644 Binary files a/public/images/pokemon/back/418.png and b/public/images/pokemon/back/418.png differ diff --git a/public/images/pokemon/back/419.png b/public/images/pokemon/back/419.png index 6ece4983987..7a389c2cbe3 100644 Binary files a/public/images/pokemon/back/419.png and b/public/images/pokemon/back/419.png differ diff --git a/public/images/pokemon/back/4199.png b/public/images/pokemon/back/4199.png index 1b45a0c2016..eb02986212f 100644 Binary files a/public/images/pokemon/back/4199.png and b/public/images/pokemon/back/4199.png differ diff --git a/public/images/pokemon/back/424.png b/public/images/pokemon/back/424.png index 76bc69d20e8..c953801431e 100644 Binary files a/public/images/pokemon/back/424.png and b/public/images/pokemon/back/424.png differ diff --git a/public/images/pokemon/back/456.png b/public/images/pokemon/back/456.png index 74d21eee031..216cca54757 100644 Binary files a/public/images/pokemon/back/456.png and b/public/images/pokemon/back/456.png differ diff --git a/public/images/pokemon/back/4562.png b/public/images/pokemon/back/4562.png index 6bbbf07ebdc..1e23be42716 100644 Binary files a/public/images/pokemon/back/4562.png and b/public/images/pokemon/back/4562.png differ diff --git a/public/images/pokemon/back/457.png b/public/images/pokemon/back/457.png index 239b235e7bd..806cacfaed2 100644 Binary files a/public/images/pokemon/back/457.png and b/public/images/pokemon/back/457.png differ diff --git a/public/images/pokemon/back/467.png b/public/images/pokemon/back/467.png index 0073f964ade..5edba20e48e 100644 Binary files a/public/images/pokemon/back/467.png and b/public/images/pokemon/back/467.png differ diff --git a/public/images/pokemon/back/556.png b/public/images/pokemon/back/556.png index aeab696307a..43652a17d06 100644 Binary files a/public/images/pokemon/back/556.png and b/public/images/pokemon/back/556.png differ diff --git a/public/images/pokemon/back/569-gigantamax.png b/public/images/pokemon/back/569-gigantamax.png index ca4e897ecc2..334c513dd73 100644 Binary files a/public/images/pokemon/back/569-gigantamax.png and b/public/images/pokemon/back/569-gigantamax.png differ diff --git a/public/images/pokemon/back/699.png b/public/images/pokemon/back/699.png index d24d2ad0a73..25693e4a3f9 100644 Binary files a/public/images/pokemon/back/699.png and b/public/images/pokemon/back/699.png differ diff --git a/public/images/pokemon/back/702.png b/public/images/pokemon/back/702.png index 9b375837be3..2b1d490b71a 100644 Binary files a/public/images/pokemon/back/702.png and b/public/images/pokemon/back/702.png differ diff --git a/public/images/pokemon/back/716-active.png b/public/images/pokemon/back/716-active.png index 0b5d2ec3c66..c3276ec81b6 100644 Binary files a/public/images/pokemon/back/716-active.png and b/public/images/pokemon/back/716-active.png differ diff --git a/public/images/pokemon/back/716-neutral.png b/public/images/pokemon/back/716-neutral.png index 291fb1600dd..73ebb3231cc 100644 Binary files a/public/images/pokemon/back/716-neutral.png and b/public/images/pokemon/back/716-neutral.png differ diff --git a/public/images/pokemon/back/772.png b/public/images/pokemon/back/772.png index eb4e5e9b8b1..059671261d7 100644 Binary files a/public/images/pokemon/back/772.png and b/public/images/pokemon/back/772.png differ diff --git a/public/images/pokemon/back/798.png b/public/images/pokemon/back/798.png index 085db6e0876..262f0b4fd79 100644 Binary files a/public/images/pokemon/back/798.png and b/public/images/pokemon/back/798.png differ diff --git a/public/images/pokemon/back/80-mega.png b/public/images/pokemon/back/80-mega.png index 5bc773e3475..005e2a813f3 100644 Binary files a/public/images/pokemon/back/80-mega.png and b/public/images/pokemon/back/80-mega.png differ diff --git a/public/images/pokemon/back/80.png b/public/images/pokemon/back/80.png index 25b7f5fff9c..f993d4b695b 100644 Binary files a/public/images/pokemon/back/80.png and b/public/images/pokemon/back/80.png differ diff --git a/public/images/pokemon/back/818-gigantamax.png b/public/images/pokemon/back/818-gigantamax.png index 93dc06b038c..22b6e71281a 100644 Binary files a/public/images/pokemon/back/818-gigantamax.png and b/public/images/pokemon/back/818-gigantamax.png differ diff --git a/public/images/pokemon/back/876-female.png b/public/images/pokemon/back/876-female.png index 29e7d4a2afd..5c25cc2f977 100644 Binary files a/public/images/pokemon/back/876-female.png and b/public/images/pokemon/back/876-female.png differ diff --git a/public/images/pokemon/back/876.png b/public/images/pokemon/back/876.png index 1ba33ec5516..1fc71387c62 100644 Binary files a/public/images/pokemon/back/876.png and b/public/images/pokemon/back/876.png differ diff --git a/public/images/pokemon/back/880.png b/public/images/pokemon/back/880.png index a82239996bc..d175b340bb8 100644 Binary files a/public/images/pokemon/back/880.png and b/public/images/pokemon/back/880.png differ diff --git a/public/images/pokemon/back/881.png b/public/images/pokemon/back/881.png index 852453aaaa0..2f77327cfd0 100644 Binary files a/public/images/pokemon/back/881.png and b/public/images/pokemon/back/881.png differ diff --git a/public/images/pokemon/back/882.png b/public/images/pokemon/back/882.png index cb05d6c5a91..0675270f6e9 100644 Binary files a/public/images/pokemon/back/882.png and b/public/images/pokemon/back/882.png differ diff --git a/public/images/pokemon/back/896.png b/public/images/pokemon/back/896.png index 243e9a4cfde..f989d532c8b 100644 Binary files a/public/images/pokemon/back/896.png and b/public/images/pokemon/back/896.png differ diff --git a/public/images/pokemon/back/898-ice.png b/public/images/pokemon/back/898-ice.png index ca5b032669e..b279a7416ed 100644 Binary files a/public/images/pokemon/back/898-ice.png and b/public/images/pokemon/back/898-ice.png differ diff --git a/public/images/pokemon/back/898-shadow.png b/public/images/pokemon/back/898-shadow.png index 0bbf0d2083c..0491ba74c86 100644 Binary files a/public/images/pokemon/back/898-shadow.png and b/public/images/pokemon/back/898-shadow.png differ diff --git a/public/images/pokemon/back/898.png b/public/images/pokemon/back/898.png index f99aa938ea2..fafc2947908 100644 Binary files a/public/images/pokemon/back/898.png and b/public/images/pokemon/back/898.png differ diff --git a/public/images/pokemon/back/913.png b/public/images/pokemon/back/913.png index 0935def3821..4a08acae4ea 100644 Binary files a/public/images/pokemon/back/913.png and b/public/images/pokemon/back/913.png differ diff --git a/public/images/pokemon/back/914.png b/public/images/pokemon/back/914.png index 7e87e0cc60e..221a91d018a 100644 Binary files a/public/images/pokemon/back/914.png and b/public/images/pokemon/back/914.png differ diff --git a/public/images/pokemon/back/981.png b/public/images/pokemon/back/981.png index 38b1a715f69..6744ddcf6b9 100644 Binary files a/public/images/pokemon/back/981.png and b/public/images/pokemon/back/981.png differ diff --git a/public/images/pokemon/back/female/190.png b/public/images/pokemon/back/female/190.png index 68b0624d213..1028c6410a6 100644 Binary files a/public/images/pokemon/back/female/190.png and b/public/images/pokemon/back/female/190.png differ diff --git a/public/images/pokemon/back/female/229.png b/public/images/pokemon/back/female/229.png index 76be7104638..f3bb6b6f2f6 100644 Binary files a/public/images/pokemon/back/female/229.png and b/public/images/pokemon/back/female/229.png differ diff --git a/public/images/pokemon/back/female/256.png b/public/images/pokemon/back/female/256.png index 6b6f7b97b7c..92612d4ccdc 100644 Binary files a/public/images/pokemon/back/female/256.png and b/public/images/pokemon/back/female/256.png differ diff --git a/public/images/pokemon/back/female/257.png b/public/images/pokemon/back/female/257.png index 0b93d07d99e..7b8171f39c0 100644 Binary files a/public/images/pokemon/back/female/257.png and b/public/images/pokemon/back/female/257.png differ diff --git a/public/images/pokemon/back/female/401.png b/public/images/pokemon/back/female/401.png index 2b0206a6707..8ebce5ff353 100644 Binary files a/public/images/pokemon/back/female/401.png and b/public/images/pokemon/back/female/401.png differ diff --git a/public/images/pokemon/back/female/402.png b/public/images/pokemon/back/female/402.png index bc8ca92ea94..6e88b492759 100644 Binary files a/public/images/pokemon/back/female/402.png and b/public/images/pokemon/back/female/402.png differ diff --git a/public/images/pokemon/back/female/418.png b/public/images/pokemon/back/female/418.png index 14c1eee1a63..1fc721cd534 100644 Binary files a/public/images/pokemon/back/female/418.png and b/public/images/pokemon/back/female/418.png differ diff --git a/public/images/pokemon/back/female/419.png b/public/images/pokemon/back/female/419.png index 9c757d2faba..22ac91c7208 100644 Binary files a/public/images/pokemon/back/female/419.png and b/public/images/pokemon/back/female/419.png differ diff --git a/public/images/pokemon/back/female/424.png b/public/images/pokemon/back/female/424.png index b05fbcf8a19..b8128ba481b 100644 Binary files a/public/images/pokemon/back/female/424.png and b/public/images/pokemon/back/female/424.png differ diff --git a/public/images/pokemon/back/female/456.png b/public/images/pokemon/back/female/456.png index dd326cb32f1..4c666b8cc19 100644 Binary files a/public/images/pokemon/back/female/456.png and b/public/images/pokemon/back/female/456.png differ diff --git a/public/images/pokemon/back/female/457.png b/public/images/pokemon/back/female/457.png index 04e1ae12ff4..9f243381edc 100644 Binary files a/public/images/pokemon/back/female/457.png and b/public/images/pokemon/back/female/457.png differ diff --git a/public/images/pokemon/back/shiny/1003.png b/public/images/pokemon/back/shiny/1003.png index 6ebce339091..fa50a1c8ffe 100644 Binary files a/public/images/pokemon/back/shiny/1003.png and b/public/images/pokemon/back/shiny/1003.png differ diff --git a/public/images/pokemon/back/shiny/190.png b/public/images/pokemon/back/shiny/190.png index cdbf2611180..a0a65c18c7f 100644 Binary files a/public/images/pokemon/back/shiny/190.png and b/public/images/pokemon/back/shiny/190.png differ diff --git a/public/images/pokemon/back/shiny/257-mega.png b/public/images/pokemon/back/shiny/257-mega.png index 40eb7a61bb5..04603c4a5e0 100644 Binary files a/public/images/pokemon/back/shiny/257-mega.png and b/public/images/pokemon/back/shiny/257-mega.png differ diff --git a/public/images/pokemon/back/shiny/261.png b/public/images/pokemon/back/shiny/261.png index a43f3d73f76..3399736c315 100644 Binary files a/public/images/pokemon/back/shiny/261.png and b/public/images/pokemon/back/shiny/261.png differ diff --git a/public/images/pokemon/back/shiny/262.png b/public/images/pokemon/back/shiny/262.png index afcc2c8bfe6..9e76bfed3fc 100644 Binary files a/public/images/pokemon/back/shiny/262.png and b/public/images/pokemon/back/shiny/262.png differ diff --git a/public/images/pokemon/back/shiny/303-mega.png b/public/images/pokemon/back/shiny/303-mega.png index c7de009cf2a..7097e527ddf 100644 Binary files a/public/images/pokemon/back/shiny/303-mega.png and b/public/images/pokemon/back/shiny/303-mega.png differ diff --git a/public/images/pokemon/back/shiny/357.png b/public/images/pokemon/back/shiny/357.png index da2497041e4..783f4401b2d 100644 Binary files a/public/images/pokemon/back/shiny/357.png and b/public/images/pokemon/back/shiny/357.png differ diff --git a/public/images/pokemon/back/shiny/373-mega.png b/public/images/pokemon/back/shiny/373-mega.png index 95145fd40e3..ce2c48a77b4 100644 Binary files a/public/images/pokemon/back/shiny/373-mega.png and b/public/images/pokemon/back/shiny/373-mega.png differ diff --git a/public/images/pokemon/back/shiny/4080.png b/public/images/pokemon/back/shiny/4080.png index 2c8d85fa5d7..4f214c399b8 100644 Binary files a/public/images/pokemon/back/shiny/4080.png and b/public/images/pokemon/back/shiny/4080.png differ diff --git a/public/images/pokemon/back/shiny/424.png b/public/images/pokemon/back/shiny/424.png index 67675146686..7e27173b989 100644 Binary files a/public/images/pokemon/back/shiny/424.png and b/public/images/pokemon/back/shiny/424.png differ diff --git a/public/images/pokemon/back/shiny/433.png b/public/images/pokemon/back/shiny/433.png index a6bb0e59098..040b700225f 100644 Binary files a/public/images/pokemon/back/shiny/433.png and b/public/images/pokemon/back/shiny/433.png differ diff --git a/public/images/pokemon/back/shiny/469.png b/public/images/pokemon/back/shiny/469.png index 8ac1f32335d..bdd46a1ed16 100644 Binary files a/public/images/pokemon/back/shiny/469.png and b/public/images/pokemon/back/shiny/469.png differ diff --git a/public/images/pokemon/back/shiny/477.png b/public/images/pokemon/back/shiny/477.png index 25414ab5c18..45879a61d11 100644 Binary files a/public/images/pokemon/back/shiny/477.png and b/public/images/pokemon/back/shiny/477.png differ diff --git a/public/images/pokemon/back/shiny/556.png b/public/images/pokemon/back/shiny/556.png index 4f2e991b010..8a5a573e5d5 100644 Binary files a/public/images/pokemon/back/shiny/556.png and b/public/images/pokemon/back/shiny/556.png differ diff --git a/public/images/pokemon/back/shiny/698.png b/public/images/pokemon/back/shiny/698.png index 22f9b2b660d..3daad1fd4ab 100644 Binary files a/public/images/pokemon/back/shiny/698.png and b/public/images/pokemon/back/shiny/698.png differ diff --git a/public/images/pokemon/back/shiny/699.png b/public/images/pokemon/back/shiny/699.png index 58bd840f1e3..0eb93c80f38 100644 Binary files a/public/images/pokemon/back/shiny/699.png and b/public/images/pokemon/back/shiny/699.png differ diff --git a/public/images/pokemon/back/shiny/716-active.png b/public/images/pokemon/back/shiny/716-active.png index 7c4db546443..96c6814d109 100644 Binary files a/public/images/pokemon/back/shiny/716-active.png and b/public/images/pokemon/back/shiny/716-active.png differ diff --git a/public/images/pokemon/back/shiny/716-neutral.png b/public/images/pokemon/back/shiny/716-neutral.png index fe52ce43e0c..9c80656e93c 100644 Binary files a/public/images/pokemon/back/shiny/716-neutral.png and b/public/images/pokemon/back/shiny/716-neutral.png differ diff --git a/public/images/pokemon/back/shiny/772.png b/public/images/pokemon/back/shiny/772.png index f999ba8ec01..e275c06ee41 100644 Binary files a/public/images/pokemon/back/shiny/772.png and b/public/images/pokemon/back/shiny/772.png differ diff --git a/public/images/pokemon/back/shiny/773.png b/public/images/pokemon/back/shiny/773.png index 6dba183d9d2..26aafa2d2ea 100644 Binary files a/public/images/pokemon/back/shiny/773.png and b/public/images/pokemon/back/shiny/773.png differ diff --git a/public/images/pokemon/back/shiny/798.png b/public/images/pokemon/back/shiny/798.png index b1948a6a3cd..56a45c895a0 100644 Binary files a/public/images/pokemon/back/shiny/798.png and b/public/images/pokemon/back/shiny/798.png differ diff --git a/public/images/pokemon/back/shiny/80-mega.png b/public/images/pokemon/back/shiny/80-mega.png index 6c508034c3e..5baf6ccb873 100644 Binary files a/public/images/pokemon/back/shiny/80-mega.png and b/public/images/pokemon/back/shiny/80-mega.png differ diff --git a/public/images/pokemon/back/shiny/80.png b/public/images/pokemon/back/shiny/80.png index 68e3d526965..c6c3b23f364 100644 Binary files a/public/images/pokemon/back/shiny/80.png and b/public/images/pokemon/back/shiny/80.png differ diff --git a/public/images/pokemon/back/shiny/818-gigantamax.png b/public/images/pokemon/back/shiny/818-gigantamax.png index 224858fc0be..ca58c4eb34c 100644 Binary files a/public/images/pokemon/back/shiny/818-gigantamax.png and b/public/images/pokemon/back/shiny/818-gigantamax.png differ diff --git a/public/images/pokemon/back/shiny/898-ice.png b/public/images/pokemon/back/shiny/898-ice.png index 3bf247280b9..0e96f7ca9d3 100644 Binary files a/public/images/pokemon/back/shiny/898-ice.png and b/public/images/pokemon/back/shiny/898-ice.png differ diff --git a/public/images/pokemon/back/shiny/898-shadow.png b/public/images/pokemon/back/shiny/898-shadow.png index a1ea98d1f3f..6319b0c56d1 100644 Binary files a/public/images/pokemon/back/shiny/898-shadow.png and b/public/images/pokemon/back/shiny/898-shadow.png differ diff --git a/public/images/pokemon/back/shiny/913.png b/public/images/pokemon/back/shiny/913.png index d57246f3565..e3a4405fd1e 100644 Binary files a/public/images/pokemon/back/shiny/913.png and b/public/images/pokemon/back/shiny/913.png differ diff --git a/public/images/pokemon/back/shiny/914.png b/public/images/pokemon/back/shiny/914.png index f22947be030..5e88e004266 100644 Binary files a/public/images/pokemon/back/shiny/914.png and b/public/images/pokemon/back/shiny/914.png differ diff --git a/public/images/pokemon/back/shiny/981.png b/public/images/pokemon/back/shiny/981.png index b89fa6b1629..0a5d6e5fb90 100644 Binary files a/public/images/pokemon/back/shiny/981.png and b/public/images/pokemon/back/shiny/981.png differ diff --git a/public/images/pokemon/back/shiny/983.png b/public/images/pokemon/back/shiny/983.png index 4b69919c297..5cdf12cc859 100644 Binary files a/public/images/pokemon/back/shiny/983.png and b/public/images/pokemon/back/shiny/983.png differ diff --git a/public/images/pokemon/back/shiny/female/190.png b/public/images/pokemon/back/shiny/female/190.png index 11c7f6a84e5..cb2352cfb4d 100644 Binary files a/public/images/pokemon/back/shiny/female/190.png and b/public/images/pokemon/back/shiny/female/190.png differ diff --git a/public/images/pokemon/back/shiny/female/424.png b/public/images/pokemon/back/shiny/female/424.png index dd620a0cfa9..a00c99e375e 100644 Binary files a/public/images/pokemon/back/shiny/female/424.png and b/public/images/pokemon/back/shiny/female/424.png differ diff --git a/public/images/pokemon/exp/1003.png b/public/images/pokemon/exp/1003.png index e6c8cbc2b67..2d02c4050e9 100644 Binary files a/public/images/pokemon/exp/1003.png and b/public/images/pokemon/exp/1003.png differ diff --git a/public/images/pokemon/exp/229-mega.png b/public/images/pokemon/exp/229-mega.png index bc7656d9f1c..babc5310bb4 100644 Binary files a/public/images/pokemon/exp/229-mega.png and b/public/images/pokemon/exp/229-mega.png differ diff --git a/public/images/pokemon/exp/373-mega.png b/public/images/pokemon/exp/373-mega.png index 93c27d88db6..0b93c472c76 100644 Binary files a/public/images/pokemon/exp/373-mega.png and b/public/images/pokemon/exp/373-mega.png differ diff --git a/public/images/pokemon/exp/4080.png b/public/images/pokemon/exp/4080.png index 81890a8b9e5..77e47856b0a 100644 Binary files a/public/images/pokemon/exp/4080.png and b/public/images/pokemon/exp/4080.png differ diff --git a/public/images/pokemon/exp/4199.png b/public/images/pokemon/exp/4199.png index b1858760c0c..b7a7dd9bfbb 100644 Binary files a/public/images/pokemon/exp/4199.png and b/public/images/pokemon/exp/4199.png differ diff --git a/public/images/pokemon/exp/4222.png b/public/images/pokemon/exp/4222.png index b78d04c371c..5e04aafdc22 100644 Binary files a/public/images/pokemon/exp/4222.png and b/public/images/pokemon/exp/4222.png differ diff --git a/public/images/pokemon/exp/4264.png b/public/images/pokemon/exp/4264.png index 3436fe2fe13..4bc70f2fdce 100644 Binary files a/public/images/pokemon/exp/4264.png and b/public/images/pokemon/exp/4264.png differ diff --git a/public/images/pokemon/exp/4562.png b/public/images/pokemon/exp/4562.png index 69b90f182ca..307390e8e2c 100644 Binary files a/public/images/pokemon/exp/4562.png and b/public/images/pokemon/exp/4562.png differ diff --git a/public/images/pokemon/exp/531-mega.png b/public/images/pokemon/exp/531-mega.png index d9b93c2ecca..391cc22b6db 100644 Binary files a/public/images/pokemon/exp/531-mega.png and b/public/images/pokemon/exp/531-mega.png differ diff --git a/public/images/pokemon/exp/677.png b/public/images/pokemon/exp/677.png index 70d8a0f185d..d25f1675102 100644 Binary files a/public/images/pokemon/exp/677.png and b/public/images/pokemon/exp/677.png differ diff --git a/public/images/pokemon/exp/678-female.png b/public/images/pokemon/exp/678-female.png index 3af30f5d2a7..b2021bd5923 100644 Binary files a/public/images/pokemon/exp/678-female.png and b/public/images/pokemon/exp/678-female.png differ diff --git a/public/images/pokemon/exp/698.png b/public/images/pokemon/exp/698.png index 3fba3dad32a..6d8ca555881 100644 Binary files a/public/images/pokemon/exp/698.png and b/public/images/pokemon/exp/698.png differ diff --git a/public/images/pokemon/exp/699.png b/public/images/pokemon/exp/699.png index d2108e813aa..1b7a4f402e3 100644 Binary files a/public/images/pokemon/exp/699.png and b/public/images/pokemon/exp/699.png differ diff --git a/public/images/pokemon/exp/702.png b/public/images/pokemon/exp/702.png index a5d375e779a..9d042fd8293 100644 Binary files a/public/images/pokemon/exp/702.png and b/public/images/pokemon/exp/702.png differ diff --git a/public/images/pokemon/exp/716-active.png b/public/images/pokemon/exp/716-active.png index 2f6ec8f76da..223a73d9cb7 100644 Binary files a/public/images/pokemon/exp/716-active.png and b/public/images/pokemon/exp/716-active.png differ diff --git a/public/images/pokemon/exp/716-neutral.png b/public/images/pokemon/exp/716-neutral.png index dd2d1821986..91fefde1eb7 100644 Binary files a/public/images/pokemon/exp/716-neutral.png and b/public/images/pokemon/exp/716-neutral.png differ diff --git a/public/images/pokemon/exp/752.png b/public/images/pokemon/exp/752.png index 88bbba63252..e78e9803919 100644 Binary files a/public/images/pokemon/exp/752.png and b/public/images/pokemon/exp/752.png differ diff --git a/public/images/pokemon/exp/770.png b/public/images/pokemon/exp/770.png index 7cfd1179298..30f9073a58f 100644 Binary files a/public/images/pokemon/exp/770.png and b/public/images/pokemon/exp/770.png differ diff --git a/public/images/pokemon/exp/771.png b/public/images/pokemon/exp/771.png index d53f1e52286..3a2ef676382 100644 Binary files a/public/images/pokemon/exp/771.png and b/public/images/pokemon/exp/771.png differ diff --git a/public/images/pokemon/exp/772.png b/public/images/pokemon/exp/772.png index c3a986ff15e..0a28235f416 100644 Binary files a/public/images/pokemon/exp/772.png and b/public/images/pokemon/exp/772.png differ diff --git a/public/images/pokemon/exp/773_Test.png b/public/images/pokemon/exp/773_Test.png index a77cdf691e2..ab932e78c1a 100644 Binary files a/public/images/pokemon/exp/773_Test.png and b/public/images/pokemon/exp/773_Test.png differ diff --git a/public/images/pokemon/exp/776.png b/public/images/pokemon/exp/776.png index f002de4cf6a..07550683210 100644 Binary files a/public/images/pokemon/exp/776.png and b/public/images/pokemon/exp/776.png differ diff --git a/public/images/pokemon/exp/777.png b/public/images/pokemon/exp/777.png index 0683a9e0855..f60fcc50786 100644 Binary files a/public/images/pokemon/exp/777.png and b/public/images/pokemon/exp/777.png differ diff --git a/public/images/pokemon/exp/793.png b/public/images/pokemon/exp/793.png index 683dd1153f1..fb1e37da979 100644 Binary files a/public/images/pokemon/exp/793.png and b/public/images/pokemon/exp/793.png differ diff --git a/public/images/pokemon/exp/798.png b/public/images/pokemon/exp/798.png index 6c88f1130c9..8434a1721e8 100644 Binary files a/public/images/pokemon/exp/798.png and b/public/images/pokemon/exp/798.png differ diff --git a/public/images/pokemon/exp/818.png b/public/images/pokemon/exp/818.png index ff767c962a4..b71cccf2679 100644 Binary files a/public/images/pokemon/exp/818.png and b/public/images/pokemon/exp/818.png differ diff --git a/public/images/pokemon/exp/857.png b/public/images/pokemon/exp/857.png index 0a3195e2bda..85f17ece3d8 100644 Binary files a/public/images/pokemon/exp/857.png and b/public/images/pokemon/exp/857.png differ diff --git a/public/images/pokemon/exp/876-female.png b/public/images/pokemon/exp/876-female.png index eb61b85e351..0eb5b407970 100644 Binary files a/public/images/pokemon/exp/876-female.png and b/public/images/pokemon/exp/876-female.png differ diff --git a/public/images/pokemon/exp/876.png b/public/images/pokemon/exp/876.png index e1c47e16c0c..842a98830a7 100644 Binary files a/public/images/pokemon/exp/876.png and b/public/images/pokemon/exp/876.png differ diff --git a/public/images/pokemon/exp/880.png b/public/images/pokemon/exp/880.png index 7edffc97cc7..34a898fb5ac 100644 Binary files a/public/images/pokemon/exp/880.png and b/public/images/pokemon/exp/880.png differ diff --git a/public/images/pokemon/exp/881.png b/public/images/pokemon/exp/881.png index aeaa1728f1a..291f4c261fa 100644 Binary files a/public/images/pokemon/exp/881.png and b/public/images/pokemon/exp/881.png differ diff --git a/public/images/pokemon/exp/882.png b/public/images/pokemon/exp/882.png index 15269a499ca..37c4facc672 100644 Binary files a/public/images/pokemon/exp/882.png and b/public/images/pokemon/exp/882.png differ diff --git a/public/images/pokemon/exp/896.png b/public/images/pokemon/exp/896.png index f6f646aec65..7025ae49fb8 100644 Binary files a/public/images/pokemon/exp/896.png and b/public/images/pokemon/exp/896.png differ diff --git a/public/images/pokemon/exp/898-ice.png b/public/images/pokemon/exp/898-ice.png index c7c00f5551d..3cdf6adc202 100644 Binary files a/public/images/pokemon/exp/898-ice.png and b/public/images/pokemon/exp/898-ice.png differ diff --git a/public/images/pokemon/exp/898-shadow.png b/public/images/pokemon/exp/898-shadow.png index 5a41eb6cee0..b5f18487f32 100644 Binary files a/public/images/pokemon/exp/898-shadow.png and b/public/images/pokemon/exp/898-shadow.png differ diff --git a/public/images/pokemon/exp/912.png b/public/images/pokemon/exp/912.png index 23c03342039..b8c7465768c 100644 Binary files a/public/images/pokemon/exp/912.png and b/public/images/pokemon/exp/912.png differ diff --git a/public/images/pokemon/exp/913.png b/public/images/pokemon/exp/913.png index 1bfd1c8f022..538f852208a 100644 Binary files a/public/images/pokemon/exp/913.png and b/public/images/pokemon/exp/913.png differ diff --git a/public/images/pokemon/exp/914.png b/public/images/pokemon/exp/914.png index 33ca7719da2..013934d03f5 100644 Binary files a/public/images/pokemon/exp/914.png and b/public/images/pokemon/exp/914.png differ diff --git a/public/images/pokemon/exp/940.png b/public/images/pokemon/exp/940.png index 42aed88443c..5ecc20ea5d1 100644 Binary files a/public/images/pokemon/exp/940.png and b/public/images/pokemon/exp/940.png differ diff --git a/public/images/pokemon/exp/954.png b/public/images/pokemon/exp/954.png index 6097a0f0393..85a6017c417 100644 Binary files a/public/images/pokemon/exp/954.png and b/public/images/pokemon/exp/954.png differ diff --git a/public/images/pokemon/exp/974.png b/public/images/pokemon/exp/974.png index e016f114cce..354bcbed533 100644 Binary files a/public/images/pokemon/exp/974.png and b/public/images/pokemon/exp/974.png differ diff --git a/public/images/pokemon/exp/981.png b/public/images/pokemon/exp/981.png index 5c87495f6e9..c763e8ec358 100644 Binary files a/public/images/pokemon/exp/981.png and b/public/images/pokemon/exp/981.png differ diff --git a/public/images/pokemon/exp/983.png b/public/images/pokemon/exp/983.png index 226d971ae32..2fac1759c12 100644 Binary files a/public/images/pokemon/exp/983.png and b/public/images/pokemon/exp/983.png differ diff --git a/public/images/pokemon/exp/back/1003.png b/public/images/pokemon/exp/back/1003.png index d83789d1fb8..fc368e56f81 100644 Binary files a/public/images/pokemon/exp/back/1003.png and b/public/images/pokemon/exp/back/1003.png differ diff --git a/public/images/pokemon/exp/back/229-mega.png b/public/images/pokemon/exp/back/229-mega.png index aae59a3a1d0..b538f3523dd 100644 Binary files a/public/images/pokemon/exp/back/229-mega.png and b/public/images/pokemon/exp/back/229-mega.png differ diff --git a/public/images/pokemon/exp/back/257-mega.png b/public/images/pokemon/exp/back/257-mega.png index 48bd446329f..b27b98fa153 100644 Binary files a/public/images/pokemon/exp/back/257-mega.png and b/public/images/pokemon/exp/back/257-mega.png differ diff --git a/public/images/pokemon/exp/back/4080.png b/public/images/pokemon/exp/back/4080.png index f4cfb4cd3c5..d0ffefd6503 100644 Binary files a/public/images/pokemon/exp/back/4080.png and b/public/images/pokemon/exp/back/4080.png differ diff --git a/public/images/pokemon/exp/back/4199.png b/public/images/pokemon/exp/back/4199.png index 174a325b28a..aa841a9e4d1 100644 Binary files a/public/images/pokemon/exp/back/4199.png and b/public/images/pokemon/exp/back/4199.png differ diff --git a/public/images/pokemon/exp/back/4222.png b/public/images/pokemon/exp/back/4222.png index 202817b2163..163dcb1432e 100644 Binary files a/public/images/pokemon/exp/back/4222.png and b/public/images/pokemon/exp/back/4222.png differ diff --git a/public/images/pokemon/exp/back/4562.png b/public/images/pokemon/exp/back/4562.png index 691c60c8b0a..0f8fdde8b81 100644 Binary files a/public/images/pokemon/exp/back/4562.png and b/public/images/pokemon/exp/back/4562.png differ diff --git a/public/images/pokemon/exp/back/698.png b/public/images/pokemon/exp/back/698.png index 6250dc0110f..43738b78928 100644 Binary files a/public/images/pokemon/exp/back/698.png and b/public/images/pokemon/exp/back/698.png differ diff --git a/public/images/pokemon/exp/back/699.png b/public/images/pokemon/exp/back/699.png index 7558357e206..cd1b9a82de7 100644 Binary files a/public/images/pokemon/exp/back/699.png and b/public/images/pokemon/exp/back/699.png differ diff --git a/public/images/pokemon/exp/back/702.png b/public/images/pokemon/exp/back/702.png index be5cf42476b..e90d2e5200b 100644 Binary files a/public/images/pokemon/exp/back/702.png and b/public/images/pokemon/exp/back/702.png differ diff --git a/public/images/pokemon/exp/back/716-active.png b/public/images/pokemon/exp/back/716-active.png index 5bd4fcd74c6..9d10446def7 100644 Binary files a/public/images/pokemon/exp/back/716-active.png and b/public/images/pokemon/exp/back/716-active.png differ diff --git a/public/images/pokemon/exp/back/716-neutral.png b/public/images/pokemon/exp/back/716-neutral.png index 579173b757f..871a9471357 100644 Binary files a/public/images/pokemon/exp/back/716-neutral.png and b/public/images/pokemon/exp/back/716-neutral.png differ diff --git a/public/images/pokemon/exp/back/772.png b/public/images/pokemon/exp/back/772.png index b287c20b1cb..b1ccc79fb6c 100644 Binary files a/public/images/pokemon/exp/back/772.png and b/public/images/pokemon/exp/back/772.png differ diff --git a/public/images/pokemon/exp/back/776.png b/public/images/pokemon/exp/back/776.png index 6e0c7026d56..d23a85dc55d 100644 Binary files a/public/images/pokemon/exp/back/776.png and b/public/images/pokemon/exp/back/776.png differ diff --git a/public/images/pokemon/exp/back/777.png b/public/images/pokemon/exp/back/777.png index d8f25cc7362..f4b0e23c5e2 100644 Binary files a/public/images/pokemon/exp/back/777.png and b/public/images/pokemon/exp/back/777.png differ diff --git a/public/images/pokemon/exp/back/797.png b/public/images/pokemon/exp/back/797.png index 17cae929dbc..2c3258b6858 100644 Binary files a/public/images/pokemon/exp/back/797.png and b/public/images/pokemon/exp/back/797.png differ diff --git a/public/images/pokemon/exp/back/798.png b/public/images/pokemon/exp/back/798.png index 50b663a19dd..1cc3b7c4103 100644 Binary files a/public/images/pokemon/exp/back/798.png and b/public/images/pokemon/exp/back/798.png differ diff --git a/public/images/pokemon/exp/back/80-mega.png b/public/images/pokemon/exp/back/80-mega.png index f6c67586eaa..a8bcfbcff97 100644 Binary files a/public/images/pokemon/exp/back/80-mega.png and b/public/images/pokemon/exp/back/80-mega.png differ diff --git a/public/images/pokemon/exp/back/804.png b/public/images/pokemon/exp/back/804.png index 1dbf3c502d3..5de6c92f36d 100644 Binary files a/public/images/pokemon/exp/back/804.png and b/public/images/pokemon/exp/back/804.png differ diff --git a/public/images/pokemon/exp/back/876-female.png b/public/images/pokemon/exp/back/876-female.png index 78ca08e6d09..18a4a9834a9 100644 Binary files a/public/images/pokemon/exp/back/876-female.png and b/public/images/pokemon/exp/back/876-female.png differ diff --git a/public/images/pokemon/exp/back/876.png b/public/images/pokemon/exp/back/876.png index 0073e1642af..87ed3646b3e 100644 Binary files a/public/images/pokemon/exp/back/876.png and b/public/images/pokemon/exp/back/876.png differ diff --git a/public/images/pokemon/exp/back/880.png b/public/images/pokemon/exp/back/880.png index 4ee65833e55..c2891b4165a 100644 Binary files a/public/images/pokemon/exp/back/880.png and b/public/images/pokemon/exp/back/880.png differ diff --git a/public/images/pokemon/exp/back/881.png b/public/images/pokemon/exp/back/881.png index 377347f49bc..1c0322a43fd 100644 Binary files a/public/images/pokemon/exp/back/881.png and b/public/images/pokemon/exp/back/881.png differ diff --git a/public/images/pokemon/exp/back/882.png b/public/images/pokemon/exp/back/882.png index c2c9b1b302b..d5d5ad902f5 100644 Binary files a/public/images/pokemon/exp/back/882.png and b/public/images/pokemon/exp/back/882.png differ diff --git a/public/images/pokemon/exp/back/888-crowned.png b/public/images/pokemon/exp/back/888-crowned.png index 4cc454caaa1..827678bf53d 100644 Binary files a/public/images/pokemon/exp/back/888-crowned.png and b/public/images/pokemon/exp/back/888-crowned.png differ diff --git a/public/images/pokemon/exp/back/896.png b/public/images/pokemon/exp/back/896.png index dd7a984cae7..c0c26abd888 100644 Binary files a/public/images/pokemon/exp/back/896.png and b/public/images/pokemon/exp/back/896.png differ diff --git a/public/images/pokemon/exp/back/898-ice.png b/public/images/pokemon/exp/back/898-ice.png index 899a4dd0896..bbb27761875 100644 Binary files a/public/images/pokemon/exp/back/898-ice.png and b/public/images/pokemon/exp/back/898-ice.png differ diff --git a/public/images/pokemon/exp/back/898-shadow.png b/public/images/pokemon/exp/back/898-shadow.png index 9f40e0ede70..27191a9428b 100644 Binary files a/public/images/pokemon/exp/back/898-shadow.png and b/public/images/pokemon/exp/back/898-shadow.png differ diff --git a/public/images/pokemon/exp/back/898.png b/public/images/pokemon/exp/back/898.png index eb7bc938ee3..c2154aa45e9 100644 Binary files a/public/images/pokemon/exp/back/898.png and b/public/images/pokemon/exp/back/898.png differ diff --git a/public/images/pokemon/exp/back/913.png b/public/images/pokemon/exp/back/913.png index 9a33a6de3af..cd32c18afcc 100644 Binary files a/public/images/pokemon/exp/back/913.png and b/public/images/pokemon/exp/back/913.png differ diff --git a/public/images/pokemon/exp/back/914.png b/public/images/pokemon/exp/back/914.png index abf275e24f0..e476a2e58ec 100644 Binary files a/public/images/pokemon/exp/back/914.png and b/public/images/pokemon/exp/back/914.png differ diff --git a/public/images/pokemon/exp/back/954.png b/public/images/pokemon/exp/back/954.png index be75ebbb453..64a60ce7b89 100644 Binary files a/public/images/pokemon/exp/back/954.png and b/public/images/pokemon/exp/back/954.png differ diff --git a/public/images/pokemon/exp/back/981.png b/public/images/pokemon/exp/back/981.png index 360f4267be5..523135b7f3c 100644 Binary files a/public/images/pokemon/exp/back/981.png and b/public/images/pokemon/exp/back/981.png differ diff --git a/public/images/pokemon/exp/back/shiny/1003.png b/public/images/pokemon/exp/back/shiny/1003.png index 628a1098ab6..503211f914a 100644 Binary files a/public/images/pokemon/exp/back/shiny/1003.png and b/public/images/pokemon/exp/back/shiny/1003.png differ diff --git a/public/images/pokemon/exp/back/shiny/257-mega.png b/public/images/pokemon/exp/back/shiny/257-mega.png index 47725c71073..1aaad61acbf 100644 Binary files a/public/images/pokemon/exp/back/shiny/257-mega.png and b/public/images/pokemon/exp/back/shiny/257-mega.png differ diff --git a/public/images/pokemon/exp/back/shiny/373-mega.png b/public/images/pokemon/exp/back/shiny/373-mega.png index 6c5ce34d155..558a7ef2fbc 100644 Binary files a/public/images/pokemon/exp/back/shiny/373-mega.png and b/public/images/pokemon/exp/back/shiny/373-mega.png differ diff --git a/public/images/pokemon/exp/back/shiny/4080.png b/public/images/pokemon/exp/back/shiny/4080.png index e70503a7820..1f3ec6c122a 100644 Binary files a/public/images/pokemon/exp/back/shiny/4080.png and b/public/images/pokemon/exp/back/shiny/4080.png differ diff --git a/public/images/pokemon/exp/back/shiny/4222.png b/public/images/pokemon/exp/back/shiny/4222.png index 15970729f49..e5c30260c2b 100644 Binary files a/public/images/pokemon/exp/back/shiny/4222.png and b/public/images/pokemon/exp/back/shiny/4222.png differ diff --git a/public/images/pokemon/exp/back/shiny/698.png b/public/images/pokemon/exp/back/shiny/698.png index 781f363220a..dbd5cefcbf0 100644 Binary files a/public/images/pokemon/exp/back/shiny/698.png and b/public/images/pokemon/exp/back/shiny/698.png differ diff --git a/public/images/pokemon/exp/back/shiny/699.png b/public/images/pokemon/exp/back/shiny/699.png index 0a17af2f53f..75f5c8d8b78 100644 Binary files a/public/images/pokemon/exp/back/shiny/699.png and b/public/images/pokemon/exp/back/shiny/699.png differ diff --git a/public/images/pokemon/exp/back/shiny/708.png b/public/images/pokemon/exp/back/shiny/708.png index 8673e917e75..35e2594241a 100644 Binary files a/public/images/pokemon/exp/back/shiny/708.png and b/public/images/pokemon/exp/back/shiny/708.png differ diff --git a/public/images/pokemon/exp/back/shiny/709.png b/public/images/pokemon/exp/back/shiny/709.png index 5148cd1ed08..c0d67915d17 100644 Binary files a/public/images/pokemon/exp/back/shiny/709.png and b/public/images/pokemon/exp/back/shiny/709.png differ diff --git a/public/images/pokemon/exp/back/shiny/716-active.png b/public/images/pokemon/exp/back/shiny/716-active.png index b99aabd1496..effe84542dc 100644 Binary files a/public/images/pokemon/exp/back/shiny/716-active.png and b/public/images/pokemon/exp/back/shiny/716-active.png differ diff --git a/public/images/pokemon/exp/back/shiny/716-neutral.png b/public/images/pokemon/exp/back/shiny/716-neutral.png index c8bee30f32f..26ee61454fd 100644 Binary files a/public/images/pokemon/exp/back/shiny/716-neutral.png and b/public/images/pokemon/exp/back/shiny/716-neutral.png differ diff --git a/public/images/pokemon/exp/back/shiny/772.png b/public/images/pokemon/exp/back/shiny/772.png index 407e3be6691..49124763f6c 100644 Binary files a/public/images/pokemon/exp/back/shiny/772.png and b/public/images/pokemon/exp/back/shiny/772.png differ diff --git a/public/images/pokemon/exp/back/shiny/773.png b/public/images/pokemon/exp/back/shiny/773.png index f6a98c1b43a..2c4741a6b0b 100644 Binary files a/public/images/pokemon/exp/back/shiny/773.png and b/public/images/pokemon/exp/back/shiny/773.png differ diff --git a/public/images/pokemon/exp/back/shiny/776.png b/public/images/pokemon/exp/back/shiny/776.png index d669b9f3ce6..4c4115a8132 100644 Binary files a/public/images/pokemon/exp/back/shiny/776.png and b/public/images/pokemon/exp/back/shiny/776.png differ diff --git a/public/images/pokemon/exp/back/shiny/778-disguised.png b/public/images/pokemon/exp/back/shiny/778-disguised.png index 2b1c9ecf3c9..8d3183cee0c 100644 Binary files a/public/images/pokemon/exp/back/shiny/778-disguised.png and b/public/images/pokemon/exp/back/shiny/778-disguised.png differ diff --git a/public/images/pokemon/exp/back/shiny/798.png b/public/images/pokemon/exp/back/shiny/798.png index 68fd3382ddc..322600a1fdf 100644 Binary files a/public/images/pokemon/exp/back/shiny/798.png and b/public/images/pokemon/exp/back/shiny/798.png differ diff --git a/public/images/pokemon/exp/back/shiny/80-mega.png b/public/images/pokemon/exp/back/shiny/80-mega.png index 12e88cdb937..af2277cb9da 100644 Binary files a/public/images/pokemon/exp/back/shiny/80-mega.png and b/public/images/pokemon/exp/back/shiny/80-mega.png differ diff --git a/public/images/pokemon/exp/back/shiny/888-crowned.png b/public/images/pokemon/exp/back/shiny/888-crowned.png index b3eb012e3c8..a4ed4c67ed4 100644 Binary files a/public/images/pokemon/exp/back/shiny/888-crowned.png and b/public/images/pokemon/exp/back/shiny/888-crowned.png differ diff --git a/public/images/pokemon/exp/back/shiny/898-ice.png b/public/images/pokemon/exp/back/shiny/898-ice.png index 6b3e8277180..9f1a5bd03e3 100644 Binary files a/public/images/pokemon/exp/back/shiny/898-ice.png and b/public/images/pokemon/exp/back/shiny/898-ice.png differ diff --git a/public/images/pokemon/exp/back/shiny/898-shadow.png b/public/images/pokemon/exp/back/shiny/898-shadow.png index d40bd1ab48e..2a506193e7d 100644 Binary files a/public/images/pokemon/exp/back/shiny/898-shadow.png and b/public/images/pokemon/exp/back/shiny/898-shadow.png differ diff --git a/public/images/pokemon/exp/back/shiny/913.png b/public/images/pokemon/exp/back/shiny/913.png index 07838b5d996..9d65e55e94a 100644 Binary files a/public/images/pokemon/exp/back/shiny/913.png and b/public/images/pokemon/exp/back/shiny/913.png differ diff --git a/public/images/pokemon/exp/back/shiny/914.png b/public/images/pokemon/exp/back/shiny/914.png index 2f0510312bb..17f787add8f 100644 Binary files a/public/images/pokemon/exp/back/shiny/914.png and b/public/images/pokemon/exp/back/shiny/914.png differ diff --git a/public/images/pokemon/exp/back/shiny/954.png b/public/images/pokemon/exp/back/shiny/954.png index 3d2111bd99e..e12b479d462 100644 Binary files a/public/images/pokemon/exp/back/shiny/954.png and b/public/images/pokemon/exp/back/shiny/954.png differ diff --git a/public/images/pokemon/exp/back/shiny/981.png b/public/images/pokemon/exp/back/shiny/981.png index 90a25d7eca3..153f6594be4 100644 Binary files a/public/images/pokemon/exp/back/shiny/981.png and b/public/images/pokemon/exp/back/shiny/981.png differ diff --git a/public/images/pokemon/exp/shiny/1003.png b/public/images/pokemon/exp/shiny/1003.png index 6fab9bfe143..22c1d89a879 100644 Binary files a/public/images/pokemon/exp/shiny/1003.png and b/public/images/pokemon/exp/shiny/1003.png differ diff --git a/public/images/pokemon/exp/shiny/373-mega.png b/public/images/pokemon/exp/shiny/373-mega.png index dc42bd43632..15f7a2e9017 100644 Binary files a/public/images/pokemon/exp/shiny/373-mega.png and b/public/images/pokemon/exp/shiny/373-mega.png differ diff --git a/public/images/pokemon/exp/shiny/4080.png b/public/images/pokemon/exp/shiny/4080.png index 9c383118928..20cf5abe061 100644 Binary files a/public/images/pokemon/exp/shiny/4080.png and b/public/images/pokemon/exp/shiny/4080.png differ diff --git a/public/images/pokemon/exp/shiny/4222.png b/public/images/pokemon/exp/shiny/4222.png index 443aeb5fab3..62ab7974e7e 100644 Binary files a/public/images/pokemon/exp/shiny/4222.png and b/public/images/pokemon/exp/shiny/4222.png differ diff --git a/public/images/pokemon/exp/shiny/4264.png b/public/images/pokemon/exp/shiny/4264.png index 4848f512a60..3508177e683 100644 Binary files a/public/images/pokemon/exp/shiny/4264.png and b/public/images/pokemon/exp/shiny/4264.png differ diff --git a/public/images/pokemon/exp/shiny/677.png b/public/images/pokemon/exp/shiny/677.png index d2703b7f7c0..1a236f65716 100644 Binary files a/public/images/pokemon/exp/shiny/677.png and b/public/images/pokemon/exp/shiny/677.png differ diff --git a/public/images/pokemon/exp/shiny/678-female.png b/public/images/pokemon/exp/shiny/678-female.png index 7ae67d63a33..021055baf2c 100644 Binary files a/public/images/pokemon/exp/shiny/678-female.png and b/public/images/pokemon/exp/shiny/678-female.png differ diff --git a/public/images/pokemon/exp/shiny/679.png b/public/images/pokemon/exp/shiny/679.png index 6ac3c47f498..46373f60ead 100644 Binary files a/public/images/pokemon/exp/shiny/679.png and b/public/images/pokemon/exp/shiny/679.png differ diff --git a/public/images/pokemon/exp/shiny/698.png b/public/images/pokemon/exp/shiny/698.png index 322a44b92e8..84d8ba3dac5 100644 Binary files a/public/images/pokemon/exp/shiny/698.png and b/public/images/pokemon/exp/shiny/698.png differ diff --git a/public/images/pokemon/exp/shiny/699.png b/public/images/pokemon/exp/shiny/699.png index d68bd5c0e2a..7ec9dbd7252 100644 Binary files a/public/images/pokemon/exp/shiny/699.png and b/public/images/pokemon/exp/shiny/699.png differ diff --git a/public/images/pokemon/exp/shiny/716-active.png b/public/images/pokemon/exp/shiny/716-active.png index 898d23dd4a4..126c1a78e79 100644 Binary files a/public/images/pokemon/exp/shiny/716-active.png and b/public/images/pokemon/exp/shiny/716-active.png differ diff --git a/public/images/pokemon/exp/shiny/716-neutral.png b/public/images/pokemon/exp/shiny/716-neutral.png index 062deb9ba6a..4806e57123b 100644 Binary files a/public/images/pokemon/exp/shiny/716-neutral.png and b/public/images/pokemon/exp/shiny/716-neutral.png differ diff --git a/public/images/pokemon/exp/shiny/752.png b/public/images/pokemon/exp/shiny/752.png index 0902846f5f5..22a70b76218 100644 Binary files a/public/images/pokemon/exp/shiny/752.png and b/public/images/pokemon/exp/shiny/752.png differ diff --git a/public/images/pokemon/exp/shiny/771.png b/public/images/pokemon/exp/shiny/771.png index 76bf27514d4..b9e8e315b77 100644 Binary files a/public/images/pokemon/exp/shiny/771.png and b/public/images/pokemon/exp/shiny/771.png differ diff --git a/public/images/pokemon/exp/shiny/772.png b/public/images/pokemon/exp/shiny/772.png index 80be3267ea8..16bc67faf12 100644 Binary files a/public/images/pokemon/exp/shiny/772.png and b/public/images/pokemon/exp/shiny/772.png differ diff --git a/public/images/pokemon/exp/shiny/773.png b/public/images/pokemon/exp/shiny/773.png index 407cc9144ef..9b0c6b98b9d 100644 Binary files a/public/images/pokemon/exp/shiny/773.png and b/public/images/pokemon/exp/shiny/773.png differ diff --git a/public/images/pokemon/exp/shiny/776.png b/public/images/pokemon/exp/shiny/776.png index 882a4ed5a6d..a0a363aff3e 100644 Binary files a/public/images/pokemon/exp/shiny/776.png and b/public/images/pokemon/exp/shiny/776.png differ diff --git a/public/images/pokemon/exp/shiny/777.png b/public/images/pokemon/exp/shiny/777.png index 4862152e407..504a2d23abc 100644 Binary files a/public/images/pokemon/exp/shiny/777.png and b/public/images/pokemon/exp/shiny/777.png differ diff --git a/public/images/pokemon/exp/shiny/778-disguised.png b/public/images/pokemon/exp/shiny/778-disguised.png index 13fecc069c6..07f0b9183c9 100644 Binary files a/public/images/pokemon/exp/shiny/778-disguised.png and b/public/images/pokemon/exp/shiny/778-disguised.png differ diff --git a/public/images/pokemon/exp/shiny/793.png b/public/images/pokemon/exp/shiny/793.png index 7cc43d73f02..72a1e65037a 100644 Binary files a/public/images/pokemon/exp/shiny/793.png and b/public/images/pokemon/exp/shiny/793.png differ diff --git a/public/images/pokemon/exp/shiny/798.png b/public/images/pokemon/exp/shiny/798.png index b88b0c1efa5..d67c0a50fdc 100644 Binary files a/public/images/pokemon/exp/shiny/798.png and b/public/images/pokemon/exp/shiny/798.png differ diff --git a/public/images/pokemon/exp/shiny/818.png b/public/images/pokemon/exp/shiny/818.png index f4a8bfa2f6a..0105e7e38ab 100644 Binary files a/public/images/pokemon/exp/shiny/818.png and b/public/images/pokemon/exp/shiny/818.png differ diff --git a/public/images/pokemon/exp/shiny/857.png b/public/images/pokemon/exp/shiny/857.png index 65a7c0f8f39..331e54f93e6 100644 Binary files a/public/images/pokemon/exp/shiny/857.png and b/public/images/pokemon/exp/shiny/857.png differ diff --git a/public/images/pokemon/exp/shiny/898-ice.png b/public/images/pokemon/exp/shiny/898-ice.png index 33850906ca3..4fc9cb48083 100644 Binary files a/public/images/pokemon/exp/shiny/898-ice.png and b/public/images/pokemon/exp/shiny/898-ice.png differ diff --git a/public/images/pokemon/exp/shiny/898-shadow.png b/public/images/pokemon/exp/shiny/898-shadow.png index 8c4e18e6ba8..8587106d483 100644 Binary files a/public/images/pokemon/exp/shiny/898-shadow.png and b/public/images/pokemon/exp/shiny/898-shadow.png differ diff --git a/public/images/pokemon/exp/shiny/912.png b/public/images/pokemon/exp/shiny/912.png index 1f1692d6ceb..9306f0d8cef 100644 Binary files a/public/images/pokemon/exp/shiny/912.png and b/public/images/pokemon/exp/shiny/912.png differ diff --git a/public/images/pokemon/exp/shiny/913.png b/public/images/pokemon/exp/shiny/913.png index 7e458a0796c..9179cfe07f7 100644 Binary files a/public/images/pokemon/exp/shiny/913.png and b/public/images/pokemon/exp/shiny/913.png differ diff --git a/public/images/pokemon/exp/shiny/914.png b/public/images/pokemon/exp/shiny/914.png index bffa5a1489d..8697f0ea3fd 100644 Binary files a/public/images/pokemon/exp/shiny/914.png and b/public/images/pokemon/exp/shiny/914.png differ diff --git a/public/images/pokemon/exp/shiny/940.png b/public/images/pokemon/exp/shiny/940.png index 2e66b03cd9f..7eab3973ebf 100644 Binary files a/public/images/pokemon/exp/shiny/940.png and b/public/images/pokemon/exp/shiny/940.png differ diff --git a/public/images/pokemon/exp/shiny/954.png b/public/images/pokemon/exp/shiny/954.png index 8bb46149716..87f5093f221 100644 Binary files a/public/images/pokemon/exp/shiny/954.png and b/public/images/pokemon/exp/shiny/954.png differ diff --git a/public/images/pokemon/exp/shiny/970.png b/public/images/pokemon/exp/shiny/970.png index 52ad602b0a4..d455d836e51 100644 Binary files a/public/images/pokemon/exp/shiny/970.png and b/public/images/pokemon/exp/shiny/970.png differ diff --git a/public/images/pokemon/exp/shiny/981.png b/public/images/pokemon/exp/shiny/981.png index f8f977fed92..5cced7d6d3f 100644 Binary files a/public/images/pokemon/exp/shiny/981.png and b/public/images/pokemon/exp/shiny/981.png differ diff --git a/public/images/pokemon/exp/shiny/983.png b/public/images/pokemon/exp/shiny/983.png index 36e0df81562..f7505c9b1a6 100644 Binary files a/public/images/pokemon/exp/shiny/983.png and b/public/images/pokemon/exp/shiny/983.png differ diff --git a/public/images/pokemon/female/190.png b/public/images/pokemon/female/190.png index d0d5a1a2f76..a2d5c0b7b7d 100644 Binary files a/public/images/pokemon/female/190.png and b/public/images/pokemon/female/190.png differ diff --git a/public/images/pokemon/female/229.png b/public/images/pokemon/female/229.png index 3d0b516a797..836ceab6bb5 100644 Binary files a/public/images/pokemon/female/229.png and b/public/images/pokemon/female/229.png differ diff --git a/public/images/pokemon/female/232.png b/public/images/pokemon/female/232.png index 0359febee15..9477fd192f7 100644 Binary files a/public/images/pokemon/female/232.png and b/public/images/pokemon/female/232.png differ diff --git a/public/images/pokemon/female/25-cool-cosplay.png b/public/images/pokemon/female/25-cool-cosplay.png index ae1e7c76d44..9f76c7826f1 100644 Binary files a/public/images/pokemon/female/25-cool-cosplay.png and b/public/images/pokemon/female/25-cool-cosplay.png differ diff --git a/public/images/pokemon/female/256.png b/public/images/pokemon/female/256.png index f470f5daf4b..c8b0b2cbd4c 100644 Binary files a/public/images/pokemon/female/256.png and b/public/images/pokemon/female/256.png differ diff --git a/public/images/pokemon/female/257.png b/public/images/pokemon/female/257.png index 1c8a4c70757..ed3e8d2914e 100644 Binary files a/public/images/pokemon/female/257.png and b/public/images/pokemon/female/257.png differ diff --git a/public/images/pokemon/female/401.png b/public/images/pokemon/female/401.png index 8e145b0c1c2..4cd3fc77097 100644 Binary files a/public/images/pokemon/female/401.png and b/public/images/pokemon/female/401.png differ diff --git a/public/images/pokemon/female/402.png b/public/images/pokemon/female/402.png index bfa3b5b8670..1b92a7a9a95 100644 Binary files a/public/images/pokemon/female/402.png and b/public/images/pokemon/female/402.png differ diff --git a/public/images/pokemon/female/418.png b/public/images/pokemon/female/418.png index 005c917463f..fba2402c2b3 100644 Binary files a/public/images/pokemon/female/418.png and b/public/images/pokemon/female/418.png differ diff --git a/public/images/pokemon/female/419.png b/public/images/pokemon/female/419.png index 572f819749b..5fbe90ff3bd 100644 Binary files a/public/images/pokemon/female/419.png and b/public/images/pokemon/female/419.png differ diff --git a/public/images/pokemon/female/424.png b/public/images/pokemon/female/424.png index 8e4fbc235ca..4d86b5be16e 100644 Binary files a/public/images/pokemon/female/424.png and b/public/images/pokemon/female/424.png differ diff --git a/public/images/pokemon/female/45.png b/public/images/pokemon/female/45.png index fad183bbf8d..3c5d4d91aeb 100644 Binary files a/public/images/pokemon/female/45.png and b/public/images/pokemon/female/45.png differ diff --git a/public/images/pokemon/female/456.png b/public/images/pokemon/female/456.png index a50fd2aa034..ca0d454c98f 100644 Binary files a/public/images/pokemon/female/456.png and b/public/images/pokemon/female/456.png differ diff --git a/public/images/pokemon/female/457.png b/public/images/pokemon/female/457.png index 2aec3e26a07..605bb23a892 100644 Binary files a/public/images/pokemon/female/457.png and b/public/images/pokemon/female/457.png differ diff --git a/public/images/pokemon/shiny/1003.png b/public/images/pokemon/shiny/1003.png index 3c5415cf94e..17462eaf89f 100644 Binary files a/public/images/pokemon/shiny/1003.png and b/public/images/pokemon/shiny/1003.png differ diff --git a/public/images/pokemon/shiny/1018.png b/public/images/pokemon/shiny/1018.png index 7c753bb05e5..42076fd0687 100644 Binary files a/public/images/pokemon/shiny/1018.png and b/public/images/pokemon/shiny/1018.png differ diff --git a/public/images/pokemon/shiny/164.png b/public/images/pokemon/shiny/164.png index de6405ff580..4e36ce61adb 100644 Binary files a/public/images/pokemon/shiny/164.png and b/public/images/pokemon/shiny/164.png differ diff --git a/public/images/pokemon/shiny/190.png b/public/images/pokemon/shiny/190.png index 3ad2e7b5582..60b7ad3163d 100644 Binary files a/public/images/pokemon/shiny/190.png and b/public/images/pokemon/shiny/190.png differ diff --git a/public/images/pokemon/shiny/218.png b/public/images/pokemon/shiny/218.png index cd70183de39..b3e42ae4adc 100644 Binary files a/public/images/pokemon/shiny/218.png and b/public/images/pokemon/shiny/218.png differ diff --git a/public/images/pokemon/shiny/226.png b/public/images/pokemon/shiny/226.png index 5b24827b5d5..f2934a577f1 100644 Binary files a/public/images/pokemon/shiny/226.png and b/public/images/pokemon/shiny/226.png differ diff --git a/public/images/pokemon/shiny/261.png b/public/images/pokemon/shiny/261.png index 1a976339b67..6ae6e5838ce 100644 Binary files a/public/images/pokemon/shiny/261.png and b/public/images/pokemon/shiny/261.png differ diff --git a/public/images/pokemon/shiny/262.png b/public/images/pokemon/shiny/262.png index ea42b525b6b..d2dbec0bb8d 100644 Binary files a/public/images/pokemon/shiny/262.png and b/public/images/pokemon/shiny/262.png differ diff --git a/public/images/pokemon/shiny/308.png b/public/images/pokemon/shiny/308.png index 14e97cf83a3..102bc0256e4 100644 Binary files a/public/images/pokemon/shiny/308.png and b/public/images/pokemon/shiny/308.png differ diff --git a/public/images/pokemon/shiny/335.png b/public/images/pokemon/shiny/335.png index e4f8d10fb1b..765344af6fd 100644 Binary files a/public/images/pokemon/shiny/335.png and b/public/images/pokemon/shiny/335.png differ diff --git a/public/images/pokemon/shiny/336.png b/public/images/pokemon/shiny/336.png index efa1262248a..45d57027704 100644 Binary files a/public/images/pokemon/shiny/336.png and b/public/images/pokemon/shiny/336.png differ diff --git a/public/images/pokemon/shiny/357.png b/public/images/pokemon/shiny/357.png index ca74e4b466c..0eb62e53719 100644 Binary files a/public/images/pokemon/shiny/357.png and b/public/images/pokemon/shiny/357.png differ diff --git a/public/images/pokemon/shiny/370.png b/public/images/pokemon/shiny/370.png index 8a7bf0b11a8..f49fe4fe27c 100644 Binary files a/public/images/pokemon/shiny/370.png and b/public/images/pokemon/shiny/370.png differ diff --git a/public/images/pokemon/shiny/373-mega.png b/public/images/pokemon/shiny/373-mega.png index 4e9fe93fa5c..fd2e8eed6e2 100644 Binary files a/public/images/pokemon/shiny/373-mega.png and b/public/images/pokemon/shiny/373-mega.png differ diff --git a/public/images/pokemon/shiny/373.png b/public/images/pokemon/shiny/373.png index cae369ce412..6e21c49c034 100644 Binary files a/public/images/pokemon/shiny/373.png and b/public/images/pokemon/shiny/373.png differ diff --git a/public/images/pokemon/shiny/4080.png b/public/images/pokemon/shiny/4080.png index 9ff6184d692..35f3c7c0ff6 100644 Binary files a/public/images/pokemon/shiny/4080.png and b/public/images/pokemon/shiny/4080.png differ diff --git a/public/images/pokemon/shiny/4199.png b/public/images/pokemon/shiny/4199.png index d428931eff8..fb4b8b70ddb 100644 Binary files a/public/images/pokemon/shiny/4199.png and b/public/images/pokemon/shiny/4199.png differ diff --git a/public/images/pokemon/shiny/424.png b/public/images/pokemon/shiny/424.png index 0c97de2883e..5685c21e276 100644 Binary files a/public/images/pokemon/shiny/424.png and b/public/images/pokemon/shiny/424.png differ diff --git a/public/images/pokemon/shiny/433.png b/public/images/pokemon/shiny/433.png index 55021a56458..f5f34928c21 100644 Binary files a/public/images/pokemon/shiny/433.png and b/public/images/pokemon/shiny/433.png differ diff --git a/public/images/pokemon/shiny/45.png b/public/images/pokemon/shiny/45.png index 92b28c054c9..4aab94dfb65 100644 Binary files a/public/images/pokemon/shiny/45.png and b/public/images/pokemon/shiny/45.png differ diff --git a/public/images/pokemon/shiny/451.json b/public/images/pokemon/shiny/451.json index f492cdbcb04..273d546e2bb 100644 --- a/public/images/pokemon/shiny/451.json +++ b/public/images/pokemon/shiny/451.json @@ -1,2330 +1,715 @@ -{ - "textures": [ - { - "image": "451.png", - "format": "RGBA8888", - "size": { - "w": 281, - "h": 281 - }, - "scale": 1, - "frames": [ - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 69, - "h": 41 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 41 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 69, - "h": 41 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 41 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 69, - "h": 41 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 41 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 69, - "h": 41 - }, - "frame": { - "x": 0, - "y": 0, - "w": 69, - "h": 41 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 43 - }, - "frame": { - "x": 69, - "y": 0, - "w": 63, - "h": 43 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 43 - }, - "frame": { - "x": 69, - "y": 0, - "w": 63, - "h": 43 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 43 - }, - "frame": { - "x": 69, - "y": 0, - "w": 63, - "h": 43 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 43 - }, - "frame": { - "x": 69, - "y": 0, - "w": 63, - "h": 43 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 43 - }, - "frame": { - "x": 69, - "y": 0, - "w": 63, - "h": 43 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 43 - }, - "frame": { - "x": 69, - "y": 0, - "w": 63, - "h": 43 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 43 - }, - "frame": { - "x": 69, - "y": 0, - "w": 63, - "h": 43 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 63, - "h": 43 - }, - "frame": { - "x": 69, - "y": 0, - "w": 63, - "h": 43 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 66, - "h": 43 - }, - "frame": { - "x": 132, - "y": 0, - "w": 66, - "h": 43 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 66, - "h": 43 - }, - "frame": { - "x": 132, - "y": 0, - "w": 66, - "h": 43 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 66, - "h": 43 - }, - "frame": { - "x": 132, - "y": 0, - "w": 66, - "h": 43 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 66, - "h": 43 - }, - "frame": { - "x": 132, - "y": 0, - "w": 66, - "h": 43 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 65, - "h": 43 - }, - "frame": { - "x": 198, - "y": 0, - "w": 65, - "h": 43 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 65, - "h": 43 - }, - "frame": { - "x": 198, - "y": 0, - "w": 65, - "h": 43 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 65, - "h": 43 - }, - "frame": { - "x": 198, - "y": 0, - "w": 65, - "h": 43 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 65, - "h": 43 - }, - "frame": { - "x": 198, - "y": 0, - "w": 65, - "h": 43 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 65, - "h": 43 - }, - "frame": { - "x": 0, - "y": 41, - "w": 65, - "h": 43 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 65, - "h": 43 - }, - "frame": { - "x": 0, - "y": 41, - "w": 65, - "h": 43 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 65, - "h": 43 - }, - "frame": { - "x": 0, - "y": 41, - "w": 65, - "h": 43 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 65, - "h": 43 - }, - "frame": { - "x": 0, - "y": 41, - "w": 65, - "h": 43 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 44 - }, - "frame": { - "x": 65, - "y": 43, - "w": 61, - "h": 44 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 44 - }, - "frame": { - "x": 65, - "y": 43, - "w": 61, - "h": 44 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 44 - }, - "frame": { - "x": 65, - "y": 43, - "w": 61, - "h": 44 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 44 - }, - "frame": { - "x": 65, - "y": 43, - "w": 61, - "h": 44 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 44 - }, - "frame": { - "x": 65, - "y": 43, - "w": 61, - "h": 44 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 44 - }, - "frame": { - "x": 65, - "y": 43, - "w": 61, - "h": 44 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 44 - }, - "frame": { - "x": 65, - "y": 43, - "w": 61, - "h": 44 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 44 - }, - "frame": { - "x": 65, - "y": 43, - "w": 61, - "h": 44 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 62, - "h": 44 - }, - "frame": { - "x": 126, - "y": 43, - "w": 62, - "h": 44 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 62, - "h": 44 - }, - "frame": { - "x": 126, - "y": 43, - "w": 62, - "h": 44 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 62, - "h": 44 - }, - "frame": { - "x": 126, - "y": 43, - "w": 62, - "h": 44 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 62, - "h": 44 - }, - "frame": { - "x": 126, - "y": 43, - "w": 62, - "h": 44 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 63, - "h": 44 - }, - "frame": { - "x": 188, - "y": 43, - "w": 63, - "h": 44 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 63, - "h": 44 - }, - "frame": { - "x": 188, - "y": 43, - "w": 63, - "h": 44 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 63, - "h": 44 - }, - "frame": { - "x": 188, - "y": 43, - "w": 63, - "h": 44 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 63, - "h": 44 - }, - "frame": { - "x": 188, - "y": 43, - "w": 63, - "h": 44 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 0, - "y": 84, - "w": 59, - "h": 45 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 0, - "y": 84, - "w": 59, - "h": 45 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 0, - "y": 84, - "w": 59, - "h": 45 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 0, - "y": 84, - "w": 59, - "h": 45 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 0, - "y": 84, - "w": 59, - "h": 45 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 0, - "y": 84, - "w": 59, - "h": 45 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 0, - "y": 84, - "w": 59, - "h": 45 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 0, - "y": 84, - "w": 59, - "h": 45 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 59, - "y": 87, - "w": 59, - "h": 45 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 59, - "y": 87, - "w": 59, - "h": 45 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 59, - "y": 87, - "w": 59, - "h": 45 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 59, - "h": 45 - }, - "frame": { - "x": 59, - "y": 87, - "w": 59, - "h": 45 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 61, - "h": 45 - }, - "frame": { - "x": 118, - "y": 87, - "w": 61, - "h": 45 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 61, - "h": 45 - }, - "frame": { - "x": 118, - "y": 87, - "w": 61, - "h": 45 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 61, - "h": 45 - }, - "frame": { - "x": 118, - "y": 87, - "w": 61, - "h": 45 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 61, - "h": 45 - }, - "frame": { - "x": 118, - "y": 87, - "w": 61, - "h": 45 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 57, - "h": 45 - }, - "frame": { - "x": 179, - "y": 87, - "w": 57, - "h": 45 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 57, - "h": 45 - }, - "frame": { - "x": 179, - "y": 87, - "w": 57, - "h": 45 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 57, - "h": 45 - }, - "frame": { - "x": 0, - "y": 129, - "w": 57, - "h": 45 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 57, - "h": 45 - }, - "frame": { - "x": 0, - "y": 129, - "w": 57, - "h": 45 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 57, - "h": 45 - }, - "frame": { - "x": 57, - "y": 132, - "w": 57, - "h": 45 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 57, - "h": 45 - }, - "frame": { - "x": 57, - "y": 132, - "w": 57, - "h": 45 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 56, - "h": 45 - }, - "frame": { - "x": 114, - "y": 132, - "w": 56, - "h": 45 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 56, - "h": 45 - }, - "frame": { - "x": 114, - "y": 132, - "w": 56, - "h": 45 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 54, - "h": 45 - }, - "frame": { - "x": 170, - "y": 132, - "w": 54, - "h": 45 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 54, - "h": 45 - }, - "frame": { - "x": 170, - "y": 132, - "w": 54, - "h": 45 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 54, - "h": 45 - }, - "frame": { - "x": 224, - "y": 132, - "w": 54, - "h": 45 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 54, - "h": 45 - }, - "frame": { - "x": 224, - "y": 132, - "w": 54, - "h": 45 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 174, - "w": 54, - "h": 46 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 111, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 111, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 111, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 111, - "y": 177, - "w": 57, - "h": 46 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 60, - "h": 46 - }, - "frame": { - "x": 168, - "y": 177, - "w": 60, - "h": 46 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 60, - "h": 46 - }, - "frame": { - "x": 168, - "y": 177, - "w": 60, - "h": 46 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 60, - "h": 46 - }, - "frame": { - "x": 168, - "y": 177, - "w": 60, - "h": 46 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 60, - "h": 46 - }, - "frame": { - "x": 168, - "y": 177, - "w": 60, - "h": 46 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 228, - "y": 177, - "w": 53, - "h": 46 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 53, - "h": 46 - }, - "frame": { - "x": 228, - "y": 177, - "w": 53, - "h": 46 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 220, - "w": 54, - "h": 46 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 220, - "w": 54, - "h": 46 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 223, - "w": 57, - "h": 46 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 223, - "w": 57, - "h": 46 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 223, - "w": 57, - "h": 46 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 57, - "h": 46 - }, - "frame": { - "x": 54, - "y": 223, - "w": 57, - "h": 46 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 55, - "h": 46 - }, - "frame": { - "x": 111, - "y": 223, - "w": 55, - "h": 46 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 55, - "h": 46 - }, - "frame": { - "x": 111, - "y": 223, - "w": 55, - "h": 46 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 55, - "h": 46 - }, - "frame": { - "x": 166, - "y": 223, - "w": 55, - "h": 46 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 55, - "h": 46 - }, - "frame": { - "x": 166, - "y": 223, - "w": 55, - "h": 46 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 221, - "y": 223, - "w": 54, - "h": 46 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 71, - "h": 46 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 221, - "y": 223, - "w": 54, - "h": 46 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9097bf5ffed4b93401c65aa14299faaa:d22b7c7f6e33b1453fda428e689d4529:c79e17c206de27e3b7f1ce96f7df8e51$" - } +{ "frames": [ + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 68, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 68, "h": 40 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0001.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0002.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0003.png", + "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0004.png", + "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0007.png", + "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0008.png", + "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0009.png", + "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0010.png", + "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0011.png", + "frame": { "x": 68, "y": 0, "w": 64, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 64, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0012.png", + "frame": { "x": 68, "y": 0, "w": 64, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 64, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0013.png", + "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0014.png", + "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0015.png", + "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0016.png", + "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0019.png", + "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0020.png", + "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0021.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0022.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0023.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0024.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0025.png", + "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0026.png", + "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0029.png", + "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0030.png", + "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0031.png", + "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0032.png", + "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0033.png", + "frame": { "x": 68, "y": 0, "w": 64, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 64, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0034.png", + "frame": { "x": 68, "y": 0, "w": 64, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 64, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0035.png", + "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0036.png", + "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0037.png", + "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0038.png", + "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0041.png", + "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0042.png", + "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0043.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0044.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0045.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0046.png", + "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0047.png", + "frame": { "x": 232, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0048.png", + "frame": { "x": 232, "y": 86, "w": 55, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0049.png", + "frame": { "x": 117, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0050.png", + "frame": { "x": 117, "y": 85, "w": 57, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0051.png", + "frame": { "x": 117, "y": 42, "w": 60, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 60, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0052.png", + "frame": { "x": 117, "y": 42, "w": 60, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 60, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0053.png", + "frame": { "x": 132, "y": 0, "w": 63, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 63, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0054.png", + "frame": { "x": 132, "y": 0, "w": 63, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 63, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 0, "w": 68, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 68, "h": 40 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0057.png", + "frame": { "x": 195, "y": 0, "w": 63, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 63, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0058.png", + "frame": { "x": 195, "y": 0, "w": 63, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 63, "h": 42 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0059.png", + "frame": { "x": 258, "y": 0, "w": 61, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 61, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0060.png", + "frame": { "x": 258, "y": 0, "w": 61, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 61, "h": 43 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0061.png", + "frame": { "x": 58, "y": 42, "w": 59, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 59, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0062.png", + "frame": { "x": 58, "y": 42, "w": 59, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 59, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 40, "w": 58, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 58, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0064.png", + "frame": { "x": 0, "y": 40, "w": 58, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 58, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0065.png", + "frame": { "x": 177, "y": 84, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 55, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0066.png", + "frame": { "x": 177, "y": 84, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 55, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 129, "w": 55, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 55, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0068.png", + "frame": { "x": 0, "y": 129, "w": 55, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 55, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0069.png", + "frame": { "x": 112, "y": 129, "w": 55, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 55, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0070.png", + "frame": { "x": 112, "y": 129, "w": 55, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 55, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0071.png", + "frame": { "x": 167, "y": 130, "w": 55, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 55, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0072.png", + "frame": { "x": 167, "y": 130, "w": 55, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 55, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 173, "w": 54, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 54, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0074.png", + "frame": { "x": 0, "y": 173, "w": 54, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 54, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0075.png", + "frame": { "x": 54, "y": 177, "w": 52, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 52, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0076.png", + "frame": { "x": 54, "y": 177, "w": 52, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 52, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0077.png", + "frame": { "x": 210, "y": 176, "w": 53, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 53, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0078.png", + "frame": { "x": 210, "y": 176, "w": 53, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 53, "h": 44 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0079.png", + "frame": { "x": 158, "y": 174, "w": 52, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 52, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0080.png", + "frame": { "x": 158, "y": 174, "w": 52, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 52, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0081.png", + "frame": { "x": 222, "y": 131, "w": 53, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 53, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0082.png", + "frame": { "x": 222, "y": 131, "w": 53, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 53, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0083.png", + "frame": { "x": 275, "y": 132, "w": 53, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 53, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0084.png", + "frame": { "x": 275, "y": 132, "w": 53, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 53, "h": 45 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0085.png", + "frame": { "x": 55, "y": 131, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0086.png", + "frame": { "x": 55, "y": 131, "w": 52, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 52, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0087.png", + "frame": { "x": 107, "y": 173, "w": 51, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 51, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + }, + { + "filename": "0088.png", + "frame": { "x": 107, "y": 173, "w": 51, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 51, "h": 46 }, + "sourceSize": { "w": 71, "h": 46 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.8.1-x64", + "image": "451.png", + "format": "I8", + "size": { "w": 339, "h": 221 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/451.png b/public/images/pokemon/shiny/451.png index 69d165c9ae8..4f8120ce668 100644 Binary files a/public/images/pokemon/shiny/451.png and b/public/images/pokemon/shiny/451.png differ diff --git a/public/images/pokemon/shiny/469.png b/public/images/pokemon/shiny/469.png index c7f7ee3b68e..7e8d8b674d3 100644 Binary files a/public/images/pokemon/shiny/469.png and b/public/images/pokemon/shiny/469.png differ diff --git a/public/images/pokemon/shiny/47.json b/public/images/pokemon/shiny/47.json index 185bcf4b527..0aa03eab585 100644 --- a/public/images/pokemon/shiny/47.json +++ b/public/images/pokemon/shiny/47.json @@ -1,776 +1,299 @@ -{ - "textures": [ - { - "image": "47.png", - "format": "RGBA8888", - "size": { - "w": 230, - "h": 230 - }, - "scale": 1, - "frames": [ - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 6, - "y": 12, - "w": 56, - "h": 49 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 49 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 6, - "y": 12, - "w": 56, - "h": 49 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 49 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 62, - "h": 51 - }, - "frame": { - "x": 56, - "y": 0, - "w": 62, - "h": 51 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 12, - "w": 62, - "h": 51 - }, - "frame": { - "x": 56, - "y": 0, - "w": 62, - "h": 51 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 7, - "y": 8, - "w": 55, - "h": 53 - }, - "frame": { - "x": 118, - "y": 0, - "w": 55, - "h": 53 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 7, - "y": 8, - "w": 55, - "h": 53 - }, - "frame": { - "x": 118, - "y": 0, - "w": 55, - "h": 53 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 55, - "h": 54 - }, - "frame": { - "x": 173, - "y": 0, - "w": 55, - "h": 54 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 55, - "h": 54 - }, - "frame": { - "x": 173, - "y": 0, - "w": 55, - "h": 54 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 49, - "w": 53, - "h": 56 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 53, - "h": 56 - }, - "frame": { - "x": 0, - "y": 49, - "w": 53, - "h": 56 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 62, - "h": 55 - }, - "frame": { - "x": 53, - "y": 51, - "w": 62, - "h": 55 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 62, - "h": 55 - }, - "frame": { - "x": 53, - "y": 51, - "w": 62, - "h": 55 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 53, - "h": 57 - }, - "frame": { - "x": 115, - "y": 53, - "w": 53, - "h": 57 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 53, - "h": 57 - }, - "frame": { - "x": 115, - "y": 53, - "w": 53, - "h": 57 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 62, - "h": 56 - }, - "frame": { - "x": 168, - "y": 54, - "w": 62, - "h": 56 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 62, - "h": 56 - }, - "frame": { - "x": 168, - "y": 54, - "w": 62, - "h": 56 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 61, - "h": 58 - }, - "frame": { - "x": 0, - "y": 106, - "w": 61, - "h": 58 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 61, - "h": 58 - }, - "frame": { - "x": 0, - "y": 106, - "w": 61, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 54, - "h": 59 - }, - "frame": { - "x": 61, - "y": 106, - "w": 54, - "h": 59 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 54, - "h": 59 - }, - "frame": { - "x": 61, - "y": 106, - "w": 54, - "h": 59 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 57, - "h": 59 - }, - "frame": { - "x": 115, - "y": 110, - "w": 57, - "h": 59 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 57, - "h": 59 - }, - "frame": { - "x": 115, - "y": 110, - "w": 57, - "h": 59 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 57, - "h": 59 - }, - "frame": { - "x": 115, - "y": 110, - "w": 57, - "h": 59 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 57, - "h": 59 - }, - "frame": { - "x": 115, - "y": 110, - "w": 57, - "h": 59 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 54, - "h": 59 - }, - "frame": { - "x": 172, - "y": 110, - "w": 54, - "h": 59 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 54, - "h": 59 - }, - "frame": { - "x": 172, - "y": 110, - "w": 54, - "h": 59 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 61, - "h": 59 - }, - "frame": { - "x": 0, - "y": 164, - "w": 61, - "h": 59 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 61, - "h": 59 - }, - "frame": { - "x": 0, - "y": 164, - "w": 61, - "h": 59 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 57, - "h": 61 - }, - "frame": { - "x": 61, - "y": 169, - "w": 57, - "h": 61 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 57, - "h": 61 - }, - "frame": { - "x": 61, - "y": 169, - "w": 57, - "h": 61 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 57, - "h": 61 - }, - "frame": { - "x": 61, - "y": 169, - "w": 57, - "h": 61 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 57, - "h": 61 - }, - "frame": { - "x": 61, - "y": 169, - "w": 57, - "h": 61 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 61 - }, - "frame": { - "x": 118, - "y": 169, - "w": 60, - "h": 61 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 61 - }, - "frame": { - "x": 118, - "y": 169, - "w": 60, - "h": 61 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 61 - }, - "frame": { - "x": 118, - "y": 169, - "w": 60, - "h": 61 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 62, - "h": 63 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 60, - "h": 61 - }, - "frame": { - "x": 118, - "y": 169, - "w": 60, - "h": 61 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:38ba9918eb8f68ab2190b03c6512ef47:46578d6dd482a1b04fa7c2884107a0f5:fe45e2d628a6cef0908f7b82468c8798$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 58, "w": 55, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 55, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 58, "w": 55, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 55, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0003.png", + "frame": { "x": 166, "y": 114, "w": 52, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 52, "h": 56 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0004.png", + "frame": { "x": 166, "y": 114, "w": 52, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 52, "h": 56 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 169, "w": 51, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 51, "h": 54 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 169, "w": 51, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 7, "w": 51, "h": 54 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0007.png", + "frame": { "x": 104, "y": 166, "w": 53, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 9, "w": 53, "h": 52 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0008.png", + "frame": { "x": 104, "y": 166, "w": 53, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 9, "w": 53, "h": 52 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0009.png", + "frame": { "x": 157, "y": 170, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 55, "h": 49 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0010.png", + "frame": { "x": 157, "y": 170, "w": 55, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 12, "w": 55, "h": 49 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 115, "w": 53, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 53, "h": 54 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 115, "w": 53, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 8, "w": 53, "h": 54 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0013.png", + "frame": { "x": 53, "y": 116, "w": 51, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 51, "h": 56 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0014.png", + "frame": { "x": 53, "y": 116, "w": 51, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 51, "h": 56 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0015.png", + "frame": { "x": 114, "y": 109, "w": 52, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 52, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0016.png", + "frame": { "x": 114, "y": 109, "w": 52, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 52, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0017.png", + "frame": { "x": 59, "y": 57, "w": 55, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 55, "h": 59 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0018.png", + "frame": { "x": 59, "y": 57, "w": 55, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 55, "h": 59 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 58, "w": 55, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 55, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 58, "w": 55, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 55, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0021.png", + "frame": { "x": 178, "y": 56, "w": 57, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 57, "h": 58 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0022.png", + "frame": { "x": 178, "y": 56, "w": 57, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 57, "h": 58 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0023.png", + "frame": { "x": 119, "y": 0, "w": 59, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 59, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0024.png", + "frame": { "x": 119, "y": 0, "w": 59, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 59, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0025.png", + "frame": { "x": 178, "y": 0, "w": 60, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 60, "h": 56 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0026.png", + "frame": { "x": 178, "y": 0, "w": 60, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 60, "h": 56 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0027.png", + "frame": { "x": 114, "y": 57, "w": 62, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 12, "w": 62, "h": 52 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0028.png", + "frame": { "x": 114, "y": 57, "w": 62, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 12, "w": 62, "h": 52 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0029.png", + "frame": { "x": 59, "y": 0, "w": 60, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 60, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0030.png", + "frame": { "x": 59, "y": 0, "w": 60, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 60, "h": 57 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 0, "w": 59, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 59, "h": 58 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 0, "w": 59, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 59, "h": 58 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0033.png", + "frame": { "x": 178, "y": 56, "w": 57, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 57, "h": 58 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0034.png", + "frame": { "x": 178, "y": 56, "w": 57, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 57, "h": 58 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0035.png", + "frame": { "x": 59, "y": 57, "w": 55, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 55, "h": 59 }, + "sourceSize": { "w": 65, "h": 65 } + }, + { + "filename": "0036.png", + "frame": { "x": 59, "y": 57, "w": 55, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 55, "h": 59 }, + "sourceSize": { "w": 65, "h": 65 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.8.1-x64", + "image": "47.png", + "format": "I8", + "size": { "w": 238, "h": 223 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/shiny/47.png b/public/images/pokemon/shiny/47.png index ba5f60d1b8f..b1b0bb9a12a 100644 Binary files a/public/images/pokemon/shiny/47.png and b/public/images/pokemon/shiny/47.png differ diff --git a/public/images/pokemon/shiny/472.png b/public/images/pokemon/shiny/472.png index f1e833b66cb..14fa9b0fe8b 100644 Binary files a/public/images/pokemon/shiny/472.png and b/public/images/pokemon/shiny/472.png differ diff --git a/public/images/pokemon/shiny/477.png b/public/images/pokemon/shiny/477.png index 0f14172f019..2011636c517 100644 Binary files a/public/images/pokemon/shiny/477.png and b/public/images/pokemon/shiny/477.png differ diff --git a/public/images/pokemon/shiny/556.png b/public/images/pokemon/shiny/556.png index b0052759531..d62d114bbcb 100644 Binary files a/public/images/pokemon/shiny/556.png and b/public/images/pokemon/shiny/556.png differ diff --git a/public/images/pokemon/shiny/677.png b/public/images/pokemon/shiny/677.png index b90d0286879..a885bec4ee0 100644 Binary files a/public/images/pokemon/shiny/677.png and b/public/images/pokemon/shiny/677.png differ diff --git a/public/images/pokemon/shiny/678-female.png b/public/images/pokemon/shiny/678-female.png index 9a288a4fcb4..e999a0fbd69 100644 Binary files a/public/images/pokemon/shiny/678-female.png and b/public/images/pokemon/shiny/678-female.png differ diff --git a/public/images/pokemon/shiny/678.png b/public/images/pokemon/shiny/678.png index da33c6b3645..683d92c3299 100644 Binary files a/public/images/pokemon/shiny/678.png and b/public/images/pokemon/shiny/678.png differ diff --git a/public/images/pokemon/shiny/698.png b/public/images/pokemon/shiny/698.png index 0874f9af37e..c04cc11875d 100644 Binary files a/public/images/pokemon/shiny/698.png and b/public/images/pokemon/shiny/698.png differ diff --git a/public/images/pokemon/shiny/699.png b/public/images/pokemon/shiny/699.png index 16876941901..1e22a84228f 100644 Binary files a/public/images/pokemon/shiny/699.png and b/public/images/pokemon/shiny/699.png differ diff --git a/public/images/pokemon/shiny/716-active.png b/public/images/pokemon/shiny/716-active.png index 077c657f814..357f0fb843b 100644 Binary files a/public/images/pokemon/shiny/716-active.png and b/public/images/pokemon/shiny/716-active.png differ diff --git a/public/images/pokemon/shiny/716-neutral.png b/public/images/pokemon/shiny/716-neutral.png index ffe04571aa7..bcccc513da4 100644 Binary files a/public/images/pokemon/shiny/716-neutral.png and b/public/images/pokemon/shiny/716-neutral.png differ diff --git a/public/images/pokemon/shiny/772.png b/public/images/pokemon/shiny/772.png index f2038ddd4fa..759691cc312 100644 Binary files a/public/images/pokemon/shiny/772.png and b/public/images/pokemon/shiny/772.png differ diff --git a/public/images/pokemon/shiny/773.png b/public/images/pokemon/shiny/773.png index 3b2b7f9b296..6f900ae9fdc 100644 Binary files a/public/images/pokemon/shiny/773.png and b/public/images/pokemon/shiny/773.png differ diff --git a/public/images/pokemon/shiny/777.png b/public/images/pokemon/shiny/777.png index c8ba24bf3ac..8ceb5506f9b 100644 Binary files a/public/images/pokemon/shiny/777.png and b/public/images/pokemon/shiny/777.png differ diff --git a/public/images/pokemon/shiny/80-mega.png b/public/images/pokemon/shiny/80-mega.png index 399402cf618..21eb3c37a05 100644 Binary files a/public/images/pokemon/shiny/80-mega.png and b/public/images/pokemon/shiny/80-mega.png differ diff --git a/public/images/pokemon/shiny/80.png b/public/images/pokemon/shiny/80.png index 750f0d7cc92..a40953ebc30 100644 Binary files a/public/images/pokemon/shiny/80.png and b/public/images/pokemon/shiny/80.png differ diff --git a/public/images/pokemon/shiny/818-gigantamax.png b/public/images/pokemon/shiny/818-gigantamax.png index 694692964fb..6ff10199f70 100644 Binary files a/public/images/pokemon/shiny/818-gigantamax.png and b/public/images/pokemon/shiny/818-gigantamax.png differ diff --git a/public/images/pokemon/shiny/862.png b/public/images/pokemon/shiny/862.png index bc949797ee9..e48ad78032b 100644 Binary files a/public/images/pokemon/shiny/862.png and b/public/images/pokemon/shiny/862.png differ diff --git a/public/images/pokemon/shiny/864.png b/public/images/pokemon/shiny/864.png index 780f52945f2..383dfecc748 100644 Binary files a/public/images/pokemon/shiny/864.png and b/public/images/pokemon/shiny/864.png differ diff --git a/public/images/pokemon/shiny/898-ice.png b/public/images/pokemon/shiny/898-ice.png index d262f8c3e9d..ae98d45e159 100644 Binary files a/public/images/pokemon/shiny/898-ice.png and b/public/images/pokemon/shiny/898-ice.png differ diff --git a/public/images/pokemon/shiny/898-shadow.png b/public/images/pokemon/shiny/898-shadow.png index 6744535f165..6d056c192b1 100644 Binary files a/public/images/pokemon/shiny/898-shadow.png and b/public/images/pokemon/shiny/898-shadow.png differ diff --git a/public/images/pokemon/shiny/912.png b/public/images/pokemon/shiny/912.png index 9fcdbbae78f..70067668d6a 100644 Binary files a/public/images/pokemon/shiny/912.png and b/public/images/pokemon/shiny/912.png differ diff --git a/public/images/pokemon/shiny/913.png b/public/images/pokemon/shiny/913.png index 5791f5be095..08eb57e1957 100644 Binary files a/public/images/pokemon/shiny/913.png and b/public/images/pokemon/shiny/913.png differ diff --git a/public/images/pokemon/shiny/914.png b/public/images/pokemon/shiny/914.png index f20466d543d..950f964aa09 100644 Binary files a/public/images/pokemon/shiny/914.png and b/public/images/pokemon/shiny/914.png differ diff --git a/public/images/pokemon/shiny/940.png b/public/images/pokemon/shiny/940.png index 77b45558e2c..a953bd6fc44 100644 Binary files a/public/images/pokemon/shiny/940.png and b/public/images/pokemon/shiny/940.png differ diff --git a/public/images/pokemon/shiny/941.png b/public/images/pokemon/shiny/941.png index 986a6a53a8e..5ccba807754 100644 Binary files a/public/images/pokemon/shiny/941.png and b/public/images/pokemon/shiny/941.png differ diff --git a/public/images/pokemon/shiny/981.png b/public/images/pokemon/shiny/981.png index 68570ed91f2..4b1ea705a5c 100644 Binary files a/public/images/pokemon/shiny/981.png and b/public/images/pokemon/shiny/981.png differ diff --git a/public/images/pokemon/shiny/997.png b/public/images/pokemon/shiny/997.png index a9efb86b999..e164116e56c 100644 Binary files a/public/images/pokemon/shiny/997.png and b/public/images/pokemon/shiny/997.png differ diff --git a/public/images/pokemon/shiny/female/190.png b/public/images/pokemon/shiny/female/190.png index 0fc6b5f08dd..c79a1f85fe2 100644 Binary files a/public/images/pokemon/shiny/female/190.png and b/public/images/pokemon/shiny/female/190.png differ diff --git a/public/images/pokemon/shiny/female/424.png b/public/images/pokemon/shiny/female/424.png index 84ed5063655..f84f91548c9 100644 Binary files a/public/images/pokemon/shiny/female/424.png and b/public/images/pokemon/shiny/female/424.png differ diff --git a/public/images/pokemon/shiny/female/45.png b/public/images/pokemon/shiny/female/45.png index a6bbe3039cb..2ea6e0d214b 100644 Binary files a/public/images/pokemon/shiny/female/45.png and b/public/images/pokemon/shiny/female/45.png differ diff --git a/public/images/pokemon/variant/113_1.png b/public/images/pokemon/variant/113_1.png index bf4ce11b3d7..b64aca2eb7e 100644 Binary files a/public/images/pokemon/variant/113_1.png and b/public/images/pokemon/variant/113_1.png differ diff --git a/public/images/pokemon/variant/113_2.png b/public/images/pokemon/variant/113_2.png index 455068d0c66..d89db9f3b73 100644 Binary files a/public/images/pokemon/variant/113_2.png and b/public/images/pokemon/variant/113_2.png differ diff --git a/public/images/pokemon/variant/113_3.png b/public/images/pokemon/variant/113_3.png index 3a82615fcca..2623a4c5527 100644 Binary files a/public/images/pokemon/variant/113_3.png and b/public/images/pokemon/variant/113_3.png differ diff --git a/public/images/pokemon/variant/125_3.png b/public/images/pokemon/variant/125_3.png index 89c02510442..dfab3fd2b7a 100644 Binary files a/public/images/pokemon/variant/125_3.png and b/public/images/pokemon/variant/125_3.png differ diff --git a/public/images/pokemon/variant/126_2.png b/public/images/pokemon/variant/126_2.png index 19aa928037d..12ddf148e51 100644 Binary files a/public/images/pokemon/variant/126_2.png and b/public/images/pokemon/variant/126_2.png differ diff --git a/public/images/pokemon/variant/139_3.png b/public/images/pokemon/variant/139_3.png index 0c6bd552707..90f8728ffc7 100644 Binary files a/public/images/pokemon/variant/139_3.png and b/public/images/pokemon/variant/139_3.png differ diff --git a/public/images/pokemon/variant/141_2.png b/public/images/pokemon/variant/141_2.png index 3cd10984009..c94613ee202 100644 Binary files a/public/images/pokemon/variant/141_2.png and b/public/images/pokemon/variant/141_2.png differ diff --git a/public/images/pokemon/variant/141_3.png b/public/images/pokemon/variant/141_3.png index 271e5310b84..74ff87613d6 100644 Binary files a/public/images/pokemon/variant/141_3.png and b/public/images/pokemon/variant/141_3.png differ diff --git a/public/images/pokemon/variant/144_2.png b/public/images/pokemon/variant/144_2.png index 9c5ff41d5c5..ca20163748d 100644 Binary files a/public/images/pokemon/variant/144_2.png and b/public/images/pokemon/variant/144_2.png differ diff --git a/public/images/pokemon/variant/144_3.png b/public/images/pokemon/variant/144_3.png index 52e8bb092f1..a14e9166803 100644 Binary files a/public/images/pokemon/variant/144_3.png and b/public/images/pokemon/variant/144_3.png differ diff --git a/public/images/pokemon/variant/161_3.png b/public/images/pokemon/variant/161_3.png index a26adbff423..f4badb44d7f 100644 Binary files a/public/images/pokemon/variant/161_3.png and b/public/images/pokemon/variant/161_3.png differ diff --git a/public/images/pokemon/variant/164_2.png b/public/images/pokemon/variant/164_2.png index 0bd9234ca76..a5809a334f9 100644 Binary files a/public/images/pokemon/variant/164_2.png and b/public/images/pokemon/variant/164_2.png differ diff --git a/public/images/pokemon/variant/164_3.png b/public/images/pokemon/variant/164_3.png index fb3c689aa05..38c88b30a49 100644 Binary files a/public/images/pokemon/variant/164_3.png and b/public/images/pokemon/variant/164_3.png differ diff --git a/public/images/pokemon/variant/173_3.png b/public/images/pokemon/variant/173_3.png index 5cb3abbaaec..2799a88a0df 100644 Binary files a/public/images/pokemon/variant/173_3.png and b/public/images/pokemon/variant/173_3.png differ diff --git a/public/images/pokemon/variant/180_2.png b/public/images/pokemon/variant/180_2.png index 522014a78ba..fbdd97e2d52 100644 Binary files a/public/images/pokemon/variant/180_2.png and b/public/images/pokemon/variant/180_2.png differ diff --git a/public/images/pokemon/variant/180_3.png b/public/images/pokemon/variant/180_3.png index 074a4d06b80..382b3ea0961 100644 Binary files a/public/images/pokemon/variant/180_3.png and b/public/images/pokemon/variant/180_3.png differ diff --git a/public/images/pokemon/variant/181-mega_3.png b/public/images/pokemon/variant/181-mega_3.png index 444947d3207..4adad450342 100644 Binary files a/public/images/pokemon/variant/181-mega_3.png and b/public/images/pokemon/variant/181-mega_3.png differ diff --git a/public/images/pokemon/variant/183_3.png b/public/images/pokemon/variant/183_3.png index ba04c8da2d7..479164bc4f8 100644 Binary files a/public/images/pokemon/variant/183_3.png and b/public/images/pokemon/variant/183_3.png differ diff --git a/public/images/pokemon/variant/184_2.png b/public/images/pokemon/variant/184_2.png index dc166ced0db..fd57af02f36 100644 Binary files a/public/images/pokemon/variant/184_2.png and b/public/images/pokemon/variant/184_2.png differ diff --git a/public/images/pokemon/variant/184_3.png b/public/images/pokemon/variant/184_3.png index edde99b92ff..09fa5274381 100644 Binary files a/public/images/pokemon/variant/184_3.png and b/public/images/pokemon/variant/184_3.png differ diff --git a/public/images/pokemon/variant/199_1.png b/public/images/pokemon/variant/199_1.png index 9899cae4e7f..3366b156560 100644 Binary files a/public/images/pokemon/variant/199_1.png and b/public/images/pokemon/variant/199_1.png differ diff --git a/public/images/pokemon/variant/212-mega_2.png b/public/images/pokemon/variant/212-mega_2.png index a4db96d6aac..e3d12893a29 100644 Binary files a/public/images/pokemon/variant/212-mega_2.png and b/public/images/pokemon/variant/212-mega_2.png differ diff --git a/public/images/pokemon/variant/212-mega_3.png b/public/images/pokemon/variant/212-mega_3.png index dac4b3bd552..9d7ba9e777e 100644 Binary files a/public/images/pokemon/variant/212-mega_3.png and b/public/images/pokemon/variant/212-mega_3.png differ diff --git a/public/images/pokemon/variant/212_2.png b/public/images/pokemon/variant/212_2.png index 913ab71026d..a22ed57eaf3 100644 Binary files a/public/images/pokemon/variant/212_2.png and b/public/images/pokemon/variant/212_2.png differ diff --git a/public/images/pokemon/variant/212_3.png b/public/images/pokemon/variant/212_3.png index 6a027cd53dc..1a71f292f28 100644 Binary files a/public/images/pokemon/variant/212_3.png and b/public/images/pokemon/variant/212_3.png differ diff --git a/public/images/pokemon/variant/226_2.png b/public/images/pokemon/variant/226_2.png index 770f77e7154..2d011894969 100644 Binary files a/public/images/pokemon/variant/226_2.png and b/public/images/pokemon/variant/226_2.png differ diff --git a/public/images/pokemon/variant/226_3.png b/public/images/pokemon/variant/226_3.png index eff63a19224..d0ad24bc78d 100644 Binary files a/public/images/pokemon/variant/226_3.png and b/public/images/pokemon/variant/226_3.png differ diff --git a/public/images/pokemon/variant/239_3.png b/public/images/pokemon/variant/239_3.png index 25f32c3f96c..158d8701098 100644 Binary files a/public/images/pokemon/variant/239_3.png and b/public/images/pokemon/variant/239_3.png differ diff --git a/public/images/pokemon/variant/242_1.png b/public/images/pokemon/variant/242_1.png index 987c4d5a9f9..8b5cff906e4 100644 Binary files a/public/images/pokemon/variant/242_1.png and b/public/images/pokemon/variant/242_1.png differ diff --git a/public/images/pokemon/variant/242_2.png b/public/images/pokemon/variant/242_2.png index 276d36f7091..aefddbd0cf8 100644 Binary files a/public/images/pokemon/variant/242_2.png and b/public/images/pokemon/variant/242_2.png differ diff --git a/public/images/pokemon/variant/242_3.png b/public/images/pokemon/variant/242_3.png index 6f83ed75c95..bc121988137 100644 Binary files a/public/images/pokemon/variant/242_3.png and b/public/images/pokemon/variant/242_3.png differ diff --git a/public/images/pokemon/variant/244_2.png b/public/images/pokemon/variant/244_2.png index 2b7b4e57b97..b6418e496f6 100644 Binary files a/public/images/pokemon/variant/244_2.png and b/public/images/pokemon/variant/244_2.png differ diff --git a/public/images/pokemon/variant/244_3.png b/public/images/pokemon/variant/244_3.png index 93b51f45f2f..c903b01d8ce 100644 Binary files a/public/images/pokemon/variant/244_3.png and b/public/images/pokemon/variant/244_3.png differ diff --git a/public/images/pokemon/variant/248-mega_2.png b/public/images/pokemon/variant/248-mega_2.png index a6000c370a7..1aade727abf 100644 Binary files a/public/images/pokemon/variant/248-mega_2.png and b/public/images/pokemon/variant/248-mega_2.png differ diff --git a/public/images/pokemon/variant/249_2.png b/public/images/pokemon/variant/249_2.png index 220258fb7f8..d896fa2999f 100644 Binary files a/public/images/pokemon/variant/249_2.png and b/public/images/pokemon/variant/249_2.png differ diff --git a/public/images/pokemon/variant/249_3.png b/public/images/pokemon/variant/249_3.png index 85a453e0ad5..7a932d917fb 100644 Binary files a/public/images/pokemon/variant/249_3.png and b/public/images/pokemon/variant/249_3.png differ diff --git a/public/images/pokemon/variant/250_2.png b/public/images/pokemon/variant/250_2.png index 5c1d4828ebe..d63c5310db8 100644 Binary files a/public/images/pokemon/variant/250_2.png and b/public/images/pokemon/variant/250_2.png differ diff --git a/public/images/pokemon/variant/250_3.png b/public/images/pokemon/variant/250_3.png index 90fb6bb0680..59fbb3bdfd5 100644 Binary files a/public/images/pokemon/variant/250_3.png and b/public/images/pokemon/variant/250_3.png differ diff --git a/public/images/pokemon/variant/257_3.png b/public/images/pokemon/variant/257_3.png index 8242580aaec..62c4b6589a3 100644 Binary files a/public/images/pokemon/variant/257_3.png and b/public/images/pokemon/variant/257_3.png differ diff --git a/public/images/pokemon/variant/291_1.png b/public/images/pokemon/variant/291_1.png index fea63c6c27c..30cae5bb507 100644 Binary files a/public/images/pokemon/variant/291_1.png and b/public/images/pokemon/variant/291_1.png differ diff --git a/public/images/pokemon/variant/291_2.png b/public/images/pokemon/variant/291_2.png index b7b771acb30..ccbe82a1201 100644 Binary files a/public/images/pokemon/variant/291_2.png and b/public/images/pokemon/variant/291_2.png differ diff --git a/public/images/pokemon/variant/291_3.png b/public/images/pokemon/variant/291_3.png index 72d28c371f2..26ea5d3cf4d 100644 Binary files a/public/images/pokemon/variant/291_3.png and b/public/images/pokemon/variant/291_3.png differ diff --git a/public/images/pokemon/variant/292_1.png b/public/images/pokemon/variant/292_1.png index 118bfe79542..3f4ec4df742 100644 Binary files a/public/images/pokemon/variant/292_1.png and b/public/images/pokemon/variant/292_1.png differ diff --git a/public/images/pokemon/variant/292_3.png b/public/images/pokemon/variant/292_3.png index 6b5f128fdd6..989d28d017a 100644 Binary files a/public/images/pokemon/variant/292_3.png and b/public/images/pokemon/variant/292_3.png differ diff --git a/public/images/pokemon/variant/298_2.png b/public/images/pokemon/variant/298_2.png index b48ebec70ad..f071c40c69a 100644 Binary files a/public/images/pokemon/variant/298_2.png and b/public/images/pokemon/variant/298_2.png differ diff --git a/public/images/pokemon/variant/298_3.png b/public/images/pokemon/variant/298_3.png index 137cee603a7..5dbf9b03b31 100644 Binary files a/public/images/pokemon/variant/298_3.png and b/public/images/pokemon/variant/298_3.png differ diff --git a/public/images/pokemon/variant/2_2.png b/public/images/pokemon/variant/2_2.png index 2477646fef4..b12bd60bd23 100644 Binary files a/public/images/pokemon/variant/2_2.png and b/public/images/pokemon/variant/2_2.png differ diff --git a/public/images/pokemon/variant/3-mega_2.png b/public/images/pokemon/variant/3-mega_2.png index 037e983a030..ddc2bd976ad 100644 Binary files a/public/images/pokemon/variant/3-mega_2.png and b/public/images/pokemon/variant/3-mega_2.png differ diff --git a/public/images/pokemon/variant/3-mega_3.png b/public/images/pokemon/variant/3-mega_3.png index 6a967466ac1..56945d383e6 100644 Binary files a/public/images/pokemon/variant/3-mega_3.png and b/public/images/pokemon/variant/3-mega_3.png differ diff --git a/public/images/pokemon/variant/308_2.png b/public/images/pokemon/variant/308_2.png index 42a11414659..0c13b01d575 100644 Binary files a/public/images/pokemon/variant/308_2.png and b/public/images/pokemon/variant/308_2.png differ diff --git a/public/images/pokemon/variant/31_1.png b/public/images/pokemon/variant/31_1.png index d471b062136..d968477a946 100644 Binary files a/public/images/pokemon/variant/31_1.png and b/public/images/pokemon/variant/31_1.png differ diff --git a/public/images/pokemon/variant/329_3.png b/public/images/pokemon/variant/329_3.png index 45fad04068e..0530cfa7be3 100644 Binary files a/public/images/pokemon/variant/329_3.png and b/public/images/pokemon/variant/329_3.png differ diff --git a/public/images/pokemon/variant/334-mega_2.png b/public/images/pokemon/variant/334-mega_2.png index df2c3950f2c..f0304935968 100644 Binary files a/public/images/pokemon/variant/334-mega_2.png and b/public/images/pokemon/variant/334-mega_2.png differ diff --git a/public/images/pokemon/variant/334_2.png b/public/images/pokemon/variant/334_2.png index 94457f721e3..cf30637cf79 100644 Binary files a/public/images/pokemon/variant/334_2.png and b/public/images/pokemon/variant/334_2.png differ diff --git a/public/images/pokemon/variant/334_3.png b/public/images/pokemon/variant/334_3.png index 67fd670b3cb..b54ed45c264 100644 Binary files a/public/images/pokemon/variant/334_3.png and b/public/images/pokemon/variant/334_3.png differ diff --git a/public/images/pokemon/variant/335_2.png b/public/images/pokemon/variant/335_2.png index 6f7924b4b33..4baa18218ae 100644 Binary files a/public/images/pokemon/variant/335_2.png and b/public/images/pokemon/variant/335_2.png differ diff --git a/public/images/pokemon/variant/335_3.png b/public/images/pokemon/variant/335_3.png index 25ab4a00c09..c42ce4ce429 100644 Binary files a/public/images/pokemon/variant/335_3.png and b/public/images/pokemon/variant/335_3.png differ diff --git a/public/images/pokemon/variant/340_3.png b/public/images/pokemon/variant/340_3.png index 7ddb0768e02..24aede4bafe 100644 Binary files a/public/images/pokemon/variant/340_3.png and b/public/images/pokemon/variant/340_3.png differ diff --git a/public/images/pokemon/variant/341_2.png b/public/images/pokemon/variant/341_2.png index 71793d13d87..ff943eab93c 100644 Binary files a/public/images/pokemon/variant/341_2.png and b/public/images/pokemon/variant/341_2.png differ diff --git a/public/images/pokemon/variant/341_3.png b/public/images/pokemon/variant/341_3.png index b0e07fea033..ed4697d48b8 100644 Binary files a/public/images/pokemon/variant/341_3.png and b/public/images/pokemon/variant/341_3.png differ diff --git a/public/images/pokemon/variant/342_2.png b/public/images/pokemon/variant/342_2.png index 647d838c357..e1f8acaf8a6 100644 Binary files a/public/images/pokemon/variant/342_2.png and b/public/images/pokemon/variant/342_2.png differ diff --git a/public/images/pokemon/variant/342_3.png b/public/images/pokemon/variant/342_3.png index b4d8e18d8a8..2a10036b3f3 100644 Binary files a/public/images/pokemon/variant/342_3.png and b/public/images/pokemon/variant/342_3.png differ diff --git a/public/images/pokemon/variant/351-rainy_2.png b/public/images/pokemon/variant/351-rainy_2.png index 0b3f403c1ff..61cacb77d2e 100644 Binary files a/public/images/pokemon/variant/351-rainy_2.png and b/public/images/pokemon/variant/351-rainy_2.png differ diff --git a/public/images/pokemon/variant/351-rainy_3.png b/public/images/pokemon/variant/351-rainy_3.png index fc163d23ddf..c61be0fdd7d 100644 Binary files a/public/images/pokemon/variant/351-rainy_3.png and b/public/images/pokemon/variant/351-rainy_3.png differ diff --git a/public/images/pokemon/variant/351-sunny_2.png b/public/images/pokemon/variant/351-sunny_2.png index 6fc85cb6094..3815dd5fd8a 100644 Binary files a/public/images/pokemon/variant/351-sunny_2.png and b/public/images/pokemon/variant/351-sunny_2.png differ diff --git a/public/images/pokemon/variant/351-sunny_3.png b/public/images/pokemon/variant/351-sunny_3.png index e21f7627d1f..3627d88615e 100644 Binary files a/public/images/pokemon/variant/351-sunny_3.png and b/public/images/pokemon/variant/351-sunny_3.png differ diff --git a/public/images/pokemon/variant/351_2.png b/public/images/pokemon/variant/351_2.png index c9369b2bef2..30b88866823 100644 Binary files a/public/images/pokemon/variant/351_2.png and b/public/images/pokemon/variant/351_2.png differ diff --git a/public/images/pokemon/variant/351_3.png b/public/images/pokemon/variant/351_3.png index ba77333aa28..4e319855999 100644 Binary files a/public/images/pokemon/variant/351_3.png and b/public/images/pokemon/variant/351_3.png differ diff --git a/public/images/pokemon/variant/358_1.png b/public/images/pokemon/variant/358_1.png index 369b9828261..ddbe5e00908 100644 Binary files a/public/images/pokemon/variant/358_1.png and b/public/images/pokemon/variant/358_1.png differ diff --git a/public/images/pokemon/variant/35_3.png b/public/images/pokemon/variant/35_3.png index 90883d9b2b8..68a8194fa0d 100644 Binary files a/public/images/pokemon/variant/35_3.png and b/public/images/pokemon/variant/35_3.png differ diff --git a/public/images/pokemon/variant/362_2.png b/public/images/pokemon/variant/362_2.png index 1775f62a68f..3c21d176209 100644 Binary files a/public/images/pokemon/variant/362_2.png and b/public/images/pokemon/variant/362_2.png differ diff --git a/public/images/pokemon/variant/362_3.png b/public/images/pokemon/variant/362_3.png index 7b0d15894db..72b598a2d7b 100644 Binary files a/public/images/pokemon/variant/362_3.png and b/public/images/pokemon/variant/362_3.png differ diff --git a/public/images/pokemon/variant/373-mega_2.png b/public/images/pokemon/variant/373-mega_2.png index 2ddf5e07af5..ebde7060535 100644 Binary files a/public/images/pokemon/variant/373-mega_2.png and b/public/images/pokemon/variant/373-mega_2.png differ diff --git a/public/images/pokemon/variant/373-mega_3.png b/public/images/pokemon/variant/373-mega_3.png index 50cc1517a17..8fd93cbc0d2 100644 Binary files a/public/images/pokemon/variant/373-mega_3.png and b/public/images/pokemon/variant/373-mega_3.png differ diff --git a/public/images/pokemon/variant/384-mega_2.png b/public/images/pokemon/variant/384-mega_2.png index a834d31418c..370cea05f93 100644 Binary files a/public/images/pokemon/variant/384-mega_2.png and b/public/images/pokemon/variant/384-mega_2.png differ diff --git a/public/images/pokemon/variant/4080_1.png b/public/images/pokemon/variant/4080_1.png index 2508ea4c736..73ccbebdfa4 100644 Binary files a/public/images/pokemon/variant/4080_1.png and b/public/images/pokemon/variant/4080_1.png differ diff --git a/public/images/pokemon/variant/412-sandy_1.png b/public/images/pokemon/variant/412-sandy_1.png index d41a9cde14b..ec173a73749 100644 Binary files a/public/images/pokemon/variant/412-sandy_1.png and b/public/images/pokemon/variant/412-sandy_1.png differ diff --git a/public/images/pokemon/variant/412-sandy_2.png b/public/images/pokemon/variant/412-sandy_2.png index cd0ac94b35a..fb8d7724760 100644 Binary files a/public/images/pokemon/variant/412-sandy_2.png and b/public/images/pokemon/variant/412-sandy_2.png differ diff --git a/public/images/pokemon/variant/412-sandy_3.png b/public/images/pokemon/variant/412-sandy_3.png index f416fa6e46d..75ae220614c 100644 Binary files a/public/images/pokemon/variant/412-sandy_3.png and b/public/images/pokemon/variant/412-sandy_3.png differ diff --git a/public/images/pokemon/variant/413-plant_1.png b/public/images/pokemon/variant/413-plant_1.png index 367ee3bffee..59de20445ab 100644 Binary files a/public/images/pokemon/variant/413-plant_1.png and b/public/images/pokemon/variant/413-plant_1.png differ diff --git a/public/images/pokemon/variant/413-plant_2.png b/public/images/pokemon/variant/413-plant_2.png index 5b89b029bee..8e29a3b0549 100644 Binary files a/public/images/pokemon/variant/413-plant_2.png and b/public/images/pokemon/variant/413-plant_2.png differ diff --git a/public/images/pokemon/variant/413-plant_3.png b/public/images/pokemon/variant/413-plant_3.png index 21b9d30a5d5..cd0dc42bae1 100644 Binary files a/public/images/pokemon/variant/413-plant_3.png and b/public/images/pokemon/variant/413-plant_3.png differ diff --git a/public/images/pokemon/variant/4144_2.png b/public/images/pokemon/variant/4144_2.png index 873b08c4247..24453364a60 100644 Binary files a/public/images/pokemon/variant/4144_2.png and b/public/images/pokemon/variant/4144_2.png differ diff --git a/public/images/pokemon/variant/4144_3.png b/public/images/pokemon/variant/4144_3.png index 164e7dc0d25..5a55039463b 100644 Binary files a/public/images/pokemon/variant/4144_3.png and b/public/images/pokemon/variant/4144_3.png differ diff --git a/public/images/pokemon/variant/4199_1.png b/public/images/pokemon/variant/4199_1.png index e2fe544a480..85f535c8256 100644 Binary files a/public/images/pokemon/variant/4199_1.png and b/public/images/pokemon/variant/4199_1.png differ diff --git a/public/images/pokemon/variant/440_3.png b/public/images/pokemon/variant/440_3.png index 6c0086945e1..b6b8f2266fa 100644 Binary files a/public/images/pokemon/variant/440_3.png and b/public/images/pokemon/variant/440_3.png differ diff --git a/public/images/pokemon/variant/466_3.png b/public/images/pokemon/variant/466_3.png index 5267e3bf87a..146c4707a4f 100644 Binary files a/public/images/pokemon/variant/466_3.png and b/public/images/pokemon/variant/466_3.png differ diff --git a/public/images/pokemon/variant/469_2.png b/public/images/pokemon/variant/469_2.png index f7ea79b0509..82874a3978c 100644 Binary files a/public/images/pokemon/variant/469_2.png and b/public/images/pokemon/variant/469_2.png differ diff --git a/public/images/pokemon/variant/469_3.png b/public/images/pokemon/variant/469_3.png index 9c724123f37..a76d0d84f5c 100644 Binary files a/public/images/pokemon/variant/469_3.png and b/public/images/pokemon/variant/469_3.png differ diff --git a/public/images/pokemon/variant/471_2.png b/public/images/pokemon/variant/471_2.png index 62be05287c6..d93266b56db 100644 Binary files a/public/images/pokemon/variant/471_2.png and b/public/images/pokemon/variant/471_2.png differ diff --git a/public/images/pokemon/variant/471_3.png b/public/images/pokemon/variant/471_3.png index 0d2f5e2cfee..12df5891dc2 100644 Binary files a/public/images/pokemon/variant/471_3.png and b/public/images/pokemon/variant/471_3.png differ diff --git a/public/images/pokemon/variant/478_2.png b/public/images/pokemon/variant/478_2.png index 152b51b0b38..65131a6ecfa 100644 Binary files a/public/images/pokemon/variant/478_2.png and b/public/images/pokemon/variant/478_2.png differ diff --git a/public/images/pokemon/variant/492-land_2.png b/public/images/pokemon/variant/492-land_2.png index 823678f5a05..cf51ec294ab 100644 Binary files a/public/images/pokemon/variant/492-land_2.png and b/public/images/pokemon/variant/492-land_2.png differ diff --git a/public/images/pokemon/variant/526_2.png b/public/images/pokemon/variant/526_2.png index cf095fcc45b..68df77dd22d 100644 Binary files a/public/images/pokemon/variant/526_2.png and b/public/images/pokemon/variant/526_2.png differ diff --git a/public/images/pokemon/variant/526_3.png b/public/images/pokemon/variant/526_3.png index c365c379910..f347af32030 100644 Binary files a/public/images/pokemon/variant/526_3.png and b/public/images/pokemon/variant/526_3.png differ diff --git a/public/images/pokemon/variant/529_2.png b/public/images/pokemon/variant/529_2.png index 049f45bd07b..59e8dc11094 100644 Binary files a/public/images/pokemon/variant/529_2.png and b/public/images/pokemon/variant/529_2.png differ diff --git a/public/images/pokemon/variant/529_3.png b/public/images/pokemon/variant/529_3.png index de34a2b8cd2..ad7c95bbcc2 100644 Binary files a/public/images/pokemon/variant/529_3.png and b/public/images/pokemon/variant/529_3.png differ diff --git a/public/images/pokemon/variant/530_2.png b/public/images/pokemon/variant/530_2.png index 00e9c7b2103..2fb768d6df4 100644 Binary files a/public/images/pokemon/variant/530_2.png and b/public/images/pokemon/variant/530_2.png differ diff --git a/public/images/pokemon/variant/530_3.png b/public/images/pokemon/variant/530_3.png index 6772ad1ea1c..f92b642163c 100644 Binary files a/public/images/pokemon/variant/530_3.png and b/public/images/pokemon/variant/530_3.png differ diff --git a/public/images/pokemon/variant/539_2.png b/public/images/pokemon/variant/539_2.png index 7db9919d8b5..7b738217ed4 100644 Binary files a/public/images/pokemon/variant/539_2.png and b/public/images/pokemon/variant/539_2.png differ diff --git a/public/images/pokemon/variant/539_3.png b/public/images/pokemon/variant/539_3.png index 9b025a27e9f..8f581d1348e 100644 Binary files a/public/images/pokemon/variant/539_3.png and b/public/images/pokemon/variant/539_3.png differ diff --git a/public/images/pokemon/variant/543_3.png b/public/images/pokemon/variant/543_3.png index f10317e806d..7877d5e39b4 100644 Binary files a/public/images/pokemon/variant/543_3.png and b/public/images/pokemon/variant/543_3.png differ diff --git a/public/images/pokemon/variant/544_3.png b/public/images/pokemon/variant/544_3.png index 921a667741d..a0d810c4a29 100644 Binary files a/public/images/pokemon/variant/544_3.png and b/public/images/pokemon/variant/544_3.png differ diff --git a/public/images/pokemon/variant/549_3.png b/public/images/pokemon/variant/549_3.png index b7f2244e373..fffb5b9848a 100644 Binary files a/public/images/pokemon/variant/549_3.png and b/public/images/pokemon/variant/549_3.png differ diff --git a/public/images/pokemon/variant/568_2.png b/public/images/pokemon/variant/568_2.png index ed4c0d50ead..5ec25e6e8a6 100644 Binary files a/public/images/pokemon/variant/568_2.png and b/public/images/pokemon/variant/568_2.png differ diff --git a/public/images/pokemon/variant/568_3.png b/public/images/pokemon/variant/568_3.png index d499797bc92..cc991834a42 100644 Binary files a/public/images/pokemon/variant/568_3.png and b/public/images/pokemon/variant/568_3.png differ diff --git a/public/images/pokemon/variant/56_2.png b/public/images/pokemon/variant/56_2.png index a4d69550157..8f9b8f258e1 100644 Binary files a/public/images/pokemon/variant/56_2.png and b/public/images/pokemon/variant/56_2.png differ diff --git a/public/images/pokemon/variant/56_3.png b/public/images/pokemon/variant/56_3.png index 0c056ccdac9..ee5508c861a 100644 Binary files a/public/images/pokemon/variant/56_3.png and b/public/images/pokemon/variant/56_3.png differ diff --git a/public/images/pokemon/variant/57_1.png b/public/images/pokemon/variant/57_1.png index 73db688c129..8ea65328703 100644 Binary files a/public/images/pokemon/variant/57_1.png and b/public/images/pokemon/variant/57_1.png differ diff --git a/public/images/pokemon/variant/57_2.png b/public/images/pokemon/variant/57_2.png index b2edfa6cea7..6786b956a3c 100644 Binary files a/public/images/pokemon/variant/57_2.png and b/public/images/pokemon/variant/57_2.png differ diff --git a/public/images/pokemon/variant/57_3.png b/public/images/pokemon/variant/57_3.png index 9ec02aa03a9..720ad1f3529 100644 Binary files a/public/images/pokemon/variant/57_3.png and b/public/images/pokemon/variant/57_3.png differ diff --git a/public/images/pokemon/variant/585-autumn_1.png b/public/images/pokemon/variant/585-autumn_1.png index bc5c1424226..8edc0f0f152 100644 Binary files a/public/images/pokemon/variant/585-autumn_1.png and b/public/images/pokemon/variant/585-autumn_1.png differ diff --git a/public/images/pokemon/variant/585-spring_1.png b/public/images/pokemon/variant/585-spring_1.png index 1f154916dcd..7ab83601cf6 100644 Binary files a/public/images/pokemon/variant/585-spring_1.png and b/public/images/pokemon/variant/585-spring_1.png differ diff --git a/public/images/pokemon/variant/585-summer_1.png b/public/images/pokemon/variant/585-summer_1.png index 59b40b7bfef..e4204ea7dd8 100644 Binary files a/public/images/pokemon/variant/585-summer_1.png and b/public/images/pokemon/variant/585-summer_1.png differ diff --git a/public/images/pokemon/variant/585-winter_1.png b/public/images/pokemon/variant/585-winter_1.png index b296e059d1c..e5a0993319c 100644 Binary files a/public/images/pokemon/variant/585-winter_1.png and b/public/images/pokemon/variant/585-winter_1.png differ diff --git a/public/images/pokemon/variant/592_3.png b/public/images/pokemon/variant/592_3.png index e7694c4c5cf..aaded0d9d7e 100644 Binary files a/public/images/pokemon/variant/592_3.png and b/public/images/pokemon/variant/592_3.png differ diff --git a/public/images/pokemon/variant/594_3.png b/public/images/pokemon/variant/594_3.png index 5db7ef43b86..91f730c416f 100644 Binary files a/public/images/pokemon/variant/594_3.png and b/public/images/pokemon/variant/594_3.png differ diff --git a/public/images/pokemon/variant/631_2.png b/public/images/pokemon/variant/631_2.png index 846ab3c59b5..e2f0d2b9252 100644 Binary files a/public/images/pokemon/variant/631_2.png and b/public/images/pokemon/variant/631_2.png differ diff --git a/public/images/pokemon/variant/631_3.png b/public/images/pokemon/variant/631_3.png index bd271ebda23..4bcb055fbe5 100644 Binary files a/public/images/pokemon/variant/631_3.png and b/public/images/pokemon/variant/631_3.png differ diff --git a/public/images/pokemon/variant/666-continental_3.png b/public/images/pokemon/variant/666-continental_3.png index 8052f0360f5..24e4c9ab37c 100644 Binary files a/public/images/pokemon/variant/666-continental_3.png and b/public/images/pokemon/variant/666-continental_3.png differ diff --git a/public/images/pokemon/variant/666-fancy_2.png b/public/images/pokemon/variant/666-fancy_2.png index 68e535cf3a1..100ba90d7e4 100644 Binary files a/public/images/pokemon/variant/666-fancy_2.png and b/public/images/pokemon/variant/666-fancy_2.png differ diff --git a/public/images/pokemon/variant/666-fancy_3.png b/public/images/pokemon/variant/666-fancy_3.png index 2accdb4f486..a8453d6cbce 100644 Binary files a/public/images/pokemon/variant/666-fancy_3.png and b/public/images/pokemon/variant/666-fancy_3.png differ diff --git a/public/images/pokemon/variant/666-poke-ball_3.png b/public/images/pokemon/variant/666-poke-ball_3.png index 64a072a7cbe..e6056246fce 100644 Binary files a/public/images/pokemon/variant/666-poke-ball_3.png and b/public/images/pokemon/variant/666-poke-ball_3.png differ diff --git a/public/images/pokemon/variant/666-river_2.png b/public/images/pokemon/variant/666-river_2.png index 9b02df92a91..a5a65f4933b 100644 Binary files a/public/images/pokemon/variant/666-river_2.png and b/public/images/pokemon/variant/666-river_2.png differ diff --git a/public/images/pokemon/variant/669-blue_2.png b/public/images/pokemon/variant/669-blue_2.png index b2f9ac59598..32ecda80b8d 100644 Binary files a/public/images/pokemon/variant/669-blue_2.png and b/public/images/pokemon/variant/669-blue_2.png differ diff --git a/public/images/pokemon/variant/669-blue_3.png b/public/images/pokemon/variant/669-blue_3.png index 8cc36b72d06..8ce437a4442 100644 Binary files a/public/images/pokemon/variant/669-blue_3.png and b/public/images/pokemon/variant/669-blue_3.png differ diff --git a/public/images/pokemon/variant/669-orange_2.png b/public/images/pokemon/variant/669-orange_2.png index 3131bba78ea..fe6a2ccbf7d 100644 Binary files a/public/images/pokemon/variant/669-orange_2.png and b/public/images/pokemon/variant/669-orange_2.png differ diff --git a/public/images/pokemon/variant/669-red_2.png b/public/images/pokemon/variant/669-red_2.png index b898c298fbf..5d30b38b1d4 100644 Binary files a/public/images/pokemon/variant/669-red_2.png and b/public/images/pokemon/variant/669-red_2.png differ diff --git a/public/images/pokemon/variant/669-yellow_2.png b/public/images/pokemon/variant/669-yellow_2.png index 37e8d8726a9..5811dfd493b 100644 Binary files a/public/images/pokemon/variant/669-yellow_2.png and b/public/images/pokemon/variant/669-yellow_2.png differ diff --git a/public/images/pokemon/variant/670-blue_2.png b/public/images/pokemon/variant/670-blue_2.png index 1362ccbd2e5..73e797d7c28 100644 Binary files a/public/images/pokemon/variant/670-blue_2.png and b/public/images/pokemon/variant/670-blue_2.png differ diff --git a/public/images/pokemon/variant/670-blue_3.png b/public/images/pokemon/variant/670-blue_3.png index 881ca7f208f..e9f9322eaf1 100644 Binary files a/public/images/pokemon/variant/670-blue_3.png and b/public/images/pokemon/variant/670-blue_3.png differ diff --git a/public/images/pokemon/variant/670-orange_2.png b/public/images/pokemon/variant/670-orange_2.png index 80ccbdf030a..1144b3deb5e 100644 Binary files a/public/images/pokemon/variant/670-orange_2.png and b/public/images/pokemon/variant/670-orange_2.png differ diff --git a/public/images/pokemon/variant/670-orange_3.png b/public/images/pokemon/variant/670-orange_3.png index 0c579de4ed8..585031e7c26 100644 Binary files a/public/images/pokemon/variant/670-orange_3.png and b/public/images/pokemon/variant/670-orange_3.png differ diff --git a/public/images/pokemon/variant/670-red_2.png b/public/images/pokemon/variant/670-red_2.png index 7c7618848b9..5a53a3fc8a1 100644 Binary files a/public/images/pokemon/variant/670-red_2.png and b/public/images/pokemon/variant/670-red_2.png differ diff --git a/public/images/pokemon/variant/670-red_3.png b/public/images/pokemon/variant/670-red_3.png index 95bea559c8d..4774c9e8012 100644 Binary files a/public/images/pokemon/variant/670-red_3.png and b/public/images/pokemon/variant/670-red_3.png differ diff --git a/public/images/pokemon/variant/670-white_2.png b/public/images/pokemon/variant/670-white_2.png index 303905201d8..f5cdefbeef6 100644 Binary files a/public/images/pokemon/variant/670-white_2.png and b/public/images/pokemon/variant/670-white_2.png differ diff --git a/public/images/pokemon/variant/670-white_3.png b/public/images/pokemon/variant/670-white_3.png index ce9479353f4..051eea69c8f 100644 Binary files a/public/images/pokemon/variant/670-white_3.png and b/public/images/pokemon/variant/670-white_3.png differ diff --git a/public/images/pokemon/variant/670-yellow_2.png b/public/images/pokemon/variant/670-yellow_2.png index e1866464222..9a02754ed75 100644 Binary files a/public/images/pokemon/variant/670-yellow_2.png and b/public/images/pokemon/variant/670-yellow_2.png differ diff --git a/public/images/pokemon/variant/670-yellow_3.png b/public/images/pokemon/variant/670-yellow_3.png index af6e6d83f43..86464b7c97e 100644 Binary files a/public/images/pokemon/variant/670-yellow_3.png and b/public/images/pokemon/variant/670-yellow_3.png differ diff --git a/public/images/pokemon/variant/671-blue_3.png b/public/images/pokemon/variant/671-blue_3.png index 8d755b76a7c..fb57dab589e 100644 Binary files a/public/images/pokemon/variant/671-blue_3.png and b/public/images/pokemon/variant/671-blue_3.png differ diff --git a/public/images/pokemon/variant/671-red_3.png b/public/images/pokemon/variant/671-red_3.png index ad3656d2b62..9daddb10dc1 100644 Binary files a/public/images/pokemon/variant/671-red_3.png and b/public/images/pokemon/variant/671-red_3.png differ diff --git a/public/images/pokemon/variant/671-white_3.png b/public/images/pokemon/variant/671-white_3.png index bab8091ae50..3c024e09b8d 100644 Binary files a/public/images/pokemon/variant/671-white_3.png and b/public/images/pokemon/variant/671-white_3.png differ diff --git a/public/images/pokemon/variant/671-yellow_3.png b/public/images/pokemon/variant/671-yellow_3.png index f518af40869..dab7a758d81 100644 Binary files a/public/images/pokemon/variant/671-yellow_3.png and b/public/images/pokemon/variant/671-yellow_3.png differ diff --git a/public/images/pokemon/variant/672_3.png b/public/images/pokemon/variant/672_3.png index 47e1401b99f..02d2fe283b9 100644 Binary files a/public/images/pokemon/variant/672_3.png and b/public/images/pokemon/variant/672_3.png differ diff --git a/public/images/pokemon/variant/696_3.png b/public/images/pokemon/variant/696_3.png index d053158281d..6eab4cd29b3 100644 Binary files a/public/images/pokemon/variant/696_3.png and b/public/images/pokemon/variant/696_3.png differ diff --git a/public/images/pokemon/variant/697_3.png b/public/images/pokemon/variant/697_3.png index c6dbd843eb0..055f35c71e0 100644 Binary files a/public/images/pokemon/variant/697_3.png and b/public/images/pokemon/variant/697_3.png differ diff --git a/public/images/pokemon/variant/69_2.png b/public/images/pokemon/variant/69_2.png index 2f2a713de27..8ed462e7c9b 100644 Binary files a/public/images/pokemon/variant/69_2.png and b/public/images/pokemon/variant/69_2.png differ diff --git a/public/images/pokemon/variant/69_3.png b/public/images/pokemon/variant/69_3.png index 537d1379e1b..6e37bdf8c33 100644 Binary files a/public/images/pokemon/variant/69_3.png and b/public/images/pokemon/variant/69_3.png differ diff --git a/public/images/pokemon/variant/715_2.png b/public/images/pokemon/variant/715_2.png index 33534d0e77e..fe80cacfd31 100644 Binary files a/public/images/pokemon/variant/715_2.png and b/public/images/pokemon/variant/715_2.png differ diff --git a/public/images/pokemon/variant/715_3.png b/public/images/pokemon/variant/715_3.png index 77b4b1d5006..e48057a11ff 100644 Binary files a/public/images/pokemon/variant/715_3.png and b/public/images/pokemon/variant/715_3.png differ diff --git a/public/images/pokemon/variant/742_2.png b/public/images/pokemon/variant/742_2.png index 43103181126..32dc5593c55 100644 Binary files a/public/images/pokemon/variant/742_2.png and b/public/images/pokemon/variant/742_2.png differ diff --git a/public/images/pokemon/variant/742_3.png b/public/images/pokemon/variant/742_3.png index 88002632e61..599b1598002 100644 Binary files a/public/images/pokemon/variant/742_3.png and b/public/images/pokemon/variant/742_3.png differ diff --git a/public/images/pokemon/variant/743_2.png b/public/images/pokemon/variant/743_2.png index fe5fbfae5d3..fb83af131eb 100644 Binary files a/public/images/pokemon/variant/743_2.png and b/public/images/pokemon/variant/743_2.png differ diff --git a/public/images/pokemon/variant/743_3.png b/public/images/pokemon/variant/743_3.png index 36a3ae6513b..7a36dc4f89c 100644 Binary files a/public/images/pokemon/variant/743_3.png and b/public/images/pokemon/variant/743_3.png differ diff --git a/public/images/pokemon/variant/756_3.png b/public/images/pokemon/variant/756_3.png index c9277b4e307..f4a072a1b2b 100644 Binary files a/public/images/pokemon/variant/756_3.png and b/public/images/pokemon/variant/756_3.png differ diff --git a/public/images/pokemon/variant/791_1.png b/public/images/pokemon/variant/791_1.png index d5ccdb14e90..719e1b34c59 100644 Binary files a/public/images/pokemon/variant/791_1.png and b/public/images/pokemon/variant/791_1.png differ diff --git a/public/images/pokemon/variant/7_2.png b/public/images/pokemon/variant/7_2.png index 13d2f17b641..63321bf71c2 100644 Binary files a/public/images/pokemon/variant/7_2.png and b/public/images/pokemon/variant/7_2.png differ diff --git a/public/images/pokemon/variant/7_3.png b/public/images/pokemon/variant/7_3.png index f15d95d100f..b4adaff2f54 100644 Binary files a/public/images/pokemon/variant/7_3.png and b/public/images/pokemon/variant/7_3.png differ diff --git a/public/images/pokemon/variant/823-gigantamax_2.png b/public/images/pokemon/variant/823-gigantamax_2.png index 9bd4dd183a3..eecb3695378 100644 Binary files a/public/images/pokemon/variant/823-gigantamax_2.png and b/public/images/pokemon/variant/823-gigantamax_2.png differ diff --git a/public/images/pokemon/variant/823-gigantamax_3.png b/public/images/pokemon/variant/823-gigantamax_3.png index 6e51618a272..0af4712fdf7 100644 Binary files a/public/images/pokemon/variant/823-gigantamax_3.png and b/public/images/pokemon/variant/823-gigantamax_3.png differ diff --git a/public/images/pokemon/variant/836_2.png b/public/images/pokemon/variant/836_2.png index 7f584eeb5ad..303975e7e58 100644 Binary files a/public/images/pokemon/variant/836_2.png and b/public/images/pokemon/variant/836_2.png differ diff --git a/public/images/pokemon/variant/836_3.png b/public/images/pokemon/variant/836_3.png index 22418aaee07..95ae2990ed2 100644 Binary files a/public/images/pokemon/variant/836_3.png and b/public/images/pokemon/variant/836_3.png differ diff --git a/public/images/pokemon/variant/83_3.png b/public/images/pokemon/variant/83_3.png index 8a2f0d763b1..eb6604c6299 100644 Binary files a/public/images/pokemon/variant/83_3.png and b/public/images/pokemon/variant/83_3.png differ diff --git a/public/images/pokemon/variant/857_2.png b/public/images/pokemon/variant/857_2.png index 6395590c758..9273ef2a097 100644 Binary files a/public/images/pokemon/variant/857_2.png and b/public/images/pokemon/variant/857_2.png differ diff --git a/public/images/pokemon/variant/857_3.png b/public/images/pokemon/variant/857_3.png index c2a1b95c337..dc3277bcc2c 100644 Binary files a/public/images/pokemon/variant/857_3.png and b/public/images/pokemon/variant/857_3.png differ diff --git a/public/images/pokemon/variant/859_2.png b/public/images/pokemon/variant/859_2.png index 111e51b0892..82e8be45c39 100644 Binary files a/public/images/pokemon/variant/859_2.png and b/public/images/pokemon/variant/859_2.png differ diff --git a/public/images/pokemon/variant/859_3.png b/public/images/pokemon/variant/859_3.png index 1c6888a0f95..800063f08aa 100644 Binary files a/public/images/pokemon/variant/859_3.png and b/public/images/pokemon/variant/859_3.png differ diff --git a/public/images/pokemon/variant/862_2.png b/public/images/pokemon/variant/862_2.png index d006a389c11..4c52d8a260f 100644 Binary files a/public/images/pokemon/variant/862_2.png and b/public/images/pokemon/variant/862_2.png differ diff --git a/public/images/pokemon/variant/862_3.png b/public/images/pokemon/variant/862_3.png index 1d9240d85e6..170ae08d72d 100644 Binary files a/public/images/pokemon/variant/862_3.png and b/public/images/pokemon/variant/862_3.png differ diff --git a/public/images/pokemon/variant/887_1.png b/public/images/pokemon/variant/887_1.png index 8348e95c664..505ac265740 100644 Binary files a/public/images/pokemon/variant/887_1.png and b/public/images/pokemon/variant/887_1.png differ diff --git a/public/images/pokemon/variant/890-eternamax_2.png b/public/images/pokemon/variant/890-eternamax_2.png index b5aab00c241..2327900b971 100644 Binary files a/public/images/pokemon/variant/890-eternamax_2.png and b/public/images/pokemon/variant/890-eternamax_2.png differ diff --git a/public/images/pokemon/variant/890-eternamax_3.png b/public/images/pokemon/variant/890-eternamax_3.png index 29a3d84c0d6..140837cfbd0 100644 Binary files a/public/images/pokemon/variant/890-eternamax_3.png and b/public/images/pokemon/variant/890-eternamax_3.png differ diff --git a/public/images/pokemon/variant/890_2.png b/public/images/pokemon/variant/890_2.png index 46d2a4590a4..936f13cb6b2 100644 Binary files a/public/images/pokemon/variant/890_2.png and b/public/images/pokemon/variant/890_2.png differ diff --git a/public/images/pokemon/variant/890_3.png b/public/images/pokemon/variant/890_3.png index 635272e7e17..683658d9b86 100644 Binary files a/public/images/pokemon/variant/890_3.png and b/public/images/pokemon/variant/890_3.png differ diff --git a/public/images/pokemon/variant/897_1.png b/public/images/pokemon/variant/897_1.png index 74e793e31fa..9519aadd702 100644 Binary files a/public/images/pokemon/variant/897_1.png and b/public/images/pokemon/variant/897_1.png differ diff --git a/public/images/pokemon/variant/8_2.png b/public/images/pokemon/variant/8_2.png index c65b2bf1aae..06067c8e4f2 100644 Binary files a/public/images/pokemon/variant/8_2.png and b/public/images/pokemon/variant/8_2.png differ diff --git a/public/images/pokemon/variant/8_3.png b/public/images/pokemon/variant/8_3.png index 55e8869cbc7..5c32863d7df 100644 Binary files a/public/images/pokemon/variant/8_3.png and b/public/images/pokemon/variant/8_3.png differ diff --git a/public/images/pokemon/variant/9-gigantamax_3.png b/public/images/pokemon/variant/9-gigantamax_3.png index 1a12ccc6f00..54819b05e7e 100644 Binary files a/public/images/pokemon/variant/9-gigantamax_3.png and b/public/images/pokemon/variant/9-gigantamax_3.png differ diff --git a/public/images/pokemon/variant/9-mega_2.png b/public/images/pokemon/variant/9-mega_2.png index c3c06c1eca7..0a56f1a3a68 100644 Binary files a/public/images/pokemon/variant/9-mega_2.png and b/public/images/pokemon/variant/9-mega_2.png differ diff --git a/public/images/pokemon/variant/9-mega_3.png b/public/images/pokemon/variant/9-mega_3.png index d7a4b6f9140..606f18d6337 100644 Binary files a/public/images/pokemon/variant/9-mega_3.png and b/public/images/pokemon/variant/9-mega_3.png differ diff --git a/public/images/pokemon/variant/909_2.png b/public/images/pokemon/variant/909_2.png index 87d636295f9..142d46abb95 100644 Binary files a/public/images/pokemon/variant/909_2.png and b/public/images/pokemon/variant/909_2.png differ diff --git a/public/images/pokemon/variant/909_3.png b/public/images/pokemon/variant/909_3.png index 9681aebe268..ec49f615edf 100644 Binary files a/public/images/pokemon/variant/909_3.png and b/public/images/pokemon/variant/909_3.png differ diff --git a/public/images/pokemon/variant/910_2.png b/public/images/pokemon/variant/910_2.png index 616d1380f64..14fcf13f9a9 100644 Binary files a/public/images/pokemon/variant/910_2.png and b/public/images/pokemon/variant/910_2.png differ diff --git a/public/images/pokemon/variant/910_3.png b/public/images/pokemon/variant/910_3.png index 5c5c051ecd5..8a9dfa4f8b0 100644 Binary files a/public/images/pokemon/variant/910_3.png and b/public/images/pokemon/variant/910_3.png differ diff --git a/public/images/pokemon/variant/913_2.png b/public/images/pokemon/variant/913_2.png index 0af21bab11c..ab5e42c3b73 100644 Binary files a/public/images/pokemon/variant/913_2.png and b/public/images/pokemon/variant/913_2.png differ diff --git a/public/images/pokemon/variant/913_3.png b/public/images/pokemon/variant/913_3.png index 42398fe12d6..3c29e2b8f91 100644 Binary files a/public/images/pokemon/variant/913_3.png and b/public/images/pokemon/variant/913_3.png differ diff --git a/public/images/pokemon/variant/914_2.png b/public/images/pokemon/variant/914_2.png index 672e45f026a..d1db92c1e8a 100644 Binary files a/public/images/pokemon/variant/914_2.png and b/public/images/pokemon/variant/914_2.png differ diff --git a/public/images/pokemon/variant/920_1.png b/public/images/pokemon/variant/920_1.png index 40d07ac6111..a0fcd5b4a7f 100644 Binary files a/public/images/pokemon/variant/920_1.png and b/public/images/pokemon/variant/920_1.png differ diff --git a/public/images/pokemon/variant/920_2.png b/public/images/pokemon/variant/920_2.png index ac8dc6ba169..71b9a3b7651 100644 Binary files a/public/images/pokemon/variant/920_2.png and b/public/images/pokemon/variant/920_2.png differ diff --git a/public/images/pokemon/variant/920_3.png b/public/images/pokemon/variant/920_3.png index b46cfe90aa6..0db8dad3cd9 100644 Binary files a/public/images/pokemon/variant/920_3.png and b/public/images/pokemon/variant/920_3.png differ diff --git a/public/images/pokemon/variant/92_1.png b/public/images/pokemon/variant/92_1.png index a47bf334486..23f4da8ef6a 100644 Binary files a/public/images/pokemon/variant/92_1.png and b/public/images/pokemon/variant/92_1.png differ diff --git a/public/images/pokemon/variant/92_2.png b/public/images/pokemon/variant/92_2.png index a6bff69023f..383151d9a72 100644 Binary files a/public/images/pokemon/variant/92_2.png and b/public/images/pokemon/variant/92_2.png differ diff --git a/public/images/pokemon/variant/92_3.png b/public/images/pokemon/variant/92_3.png index 4839b2d4ce6..38684540b9f 100644 Binary files a/public/images/pokemon/variant/92_3.png and b/public/images/pokemon/variant/92_3.png differ diff --git a/public/images/pokemon/variant/94-gigantamax_2.png b/public/images/pokemon/variant/94-gigantamax_2.png index 008536206d1..f47846e421d 100644 Binary files a/public/images/pokemon/variant/94-gigantamax_2.png and b/public/images/pokemon/variant/94-gigantamax_2.png differ diff --git a/public/images/pokemon/variant/94-gigantamax_3.png b/public/images/pokemon/variant/94-gigantamax_3.png index 91247d2373b..bd571698edc 100644 Binary files a/public/images/pokemon/variant/94-gigantamax_3.png and b/public/images/pokemon/variant/94-gigantamax_3.png differ diff --git a/public/images/pokemon/variant/94-mega_1.png b/public/images/pokemon/variant/94-mega_1.png index 5484a0b7f61..c1b560477ac 100644 Binary files a/public/images/pokemon/variant/94-mega_1.png and b/public/images/pokemon/variant/94-mega_1.png differ diff --git a/public/images/pokemon/variant/94-mega_2.png b/public/images/pokemon/variant/94-mega_2.png index 12890419db2..79329baa6e9 100644 Binary files a/public/images/pokemon/variant/94-mega_2.png and b/public/images/pokemon/variant/94-mega_2.png differ diff --git a/public/images/pokemon/variant/94-mega_3.png b/public/images/pokemon/variant/94-mega_3.png index 7abb2c15a6f..0df495494b4 100644 Binary files a/public/images/pokemon/variant/94-mega_3.png and b/public/images/pokemon/variant/94-mega_3.png differ diff --git a/public/images/pokemon/variant/968_2.png b/public/images/pokemon/variant/968_2.png index 73a91ca6913..45c8f6b260a 100644 Binary files a/public/images/pokemon/variant/968_2.png and b/public/images/pokemon/variant/968_2.png differ diff --git a/public/images/pokemon/variant/968_3.png b/public/images/pokemon/variant/968_3.png index 10e4f06fc3f..73c87fbe249 100644 Binary files a/public/images/pokemon/variant/968_3.png and b/public/images/pokemon/variant/968_3.png differ diff --git a/public/images/pokemon/variant/973_1.png b/public/images/pokemon/variant/973_1.png index 38cdfed1b5a..bbf65d9d7fa 100644 Binary files a/public/images/pokemon/variant/973_1.png and b/public/images/pokemon/variant/973_1.png differ diff --git a/public/images/pokemon/variant/973_2.png b/public/images/pokemon/variant/973_2.png index 0e0ed775104..bbebe06afb0 100644 Binary files a/public/images/pokemon/variant/973_2.png and b/public/images/pokemon/variant/973_2.png differ diff --git a/public/images/pokemon/variant/973_3.png b/public/images/pokemon/variant/973_3.png index 07c09415b98..2f90e0cdbee 100644 Binary files a/public/images/pokemon/variant/973_3.png and b/public/images/pokemon/variant/973_3.png differ diff --git a/public/images/pokemon/variant/975_2.png b/public/images/pokemon/variant/975_2.png index a122990f639..bc174f1c824 100644 Binary files a/public/images/pokemon/variant/975_2.png and b/public/images/pokemon/variant/975_2.png differ diff --git a/public/images/pokemon/variant/975_3.png b/public/images/pokemon/variant/975_3.png index e1cb9773902..218ad884dde 100644 Binary files a/public/images/pokemon/variant/975_3.png and b/public/images/pokemon/variant/975_3.png differ diff --git a/public/images/pokemon/variant/978-curly_2.png b/public/images/pokemon/variant/978-curly_2.png index d579278625f..d29314bd6ea 100644 Binary files a/public/images/pokemon/variant/978-curly_2.png and b/public/images/pokemon/variant/978-curly_2.png differ diff --git a/public/images/pokemon/variant/978-curly_3.png b/public/images/pokemon/variant/978-curly_3.png index 7bc73280dc3..5e811b4ae7d 100644 Binary files a/public/images/pokemon/variant/978-curly_3.png and b/public/images/pokemon/variant/978-curly_3.png differ diff --git a/public/images/pokemon/variant/978-droopy_2.png b/public/images/pokemon/variant/978-droopy_2.png index 4241c9009cc..cd7759606a4 100644 Binary files a/public/images/pokemon/variant/978-droopy_2.png and b/public/images/pokemon/variant/978-droopy_2.png differ diff --git a/public/images/pokemon/variant/978-droopy_3.png b/public/images/pokemon/variant/978-droopy_3.png index b7f2429b04f..d9cf0f0800d 100644 Binary files a/public/images/pokemon/variant/978-droopy_3.png and b/public/images/pokemon/variant/978-droopy_3.png differ diff --git a/public/images/pokemon/variant/978-stretchy_2.png b/public/images/pokemon/variant/978-stretchy_2.png index 786dc3ec254..07f9b62e2e7 100644 Binary files a/public/images/pokemon/variant/978-stretchy_2.png and b/public/images/pokemon/variant/978-stretchy_2.png differ diff --git a/public/images/pokemon/variant/978-stretchy_3.png b/public/images/pokemon/variant/978-stretchy_3.png index 428aa8c9c91..d1686831e1d 100644 Binary files a/public/images/pokemon/variant/978-stretchy_3.png and b/public/images/pokemon/variant/978-stretchy_3.png differ diff --git a/public/images/pokemon/variant/979_1.png b/public/images/pokemon/variant/979_1.png index 01216516c57..352783875e4 100644 Binary files a/public/images/pokemon/variant/979_1.png and b/public/images/pokemon/variant/979_1.png differ diff --git a/public/images/pokemon/variant/979_2.png b/public/images/pokemon/variant/979_2.png index 52828c62f1e..b7111102ed9 100644 Binary files a/public/images/pokemon/variant/979_2.png and b/public/images/pokemon/variant/979_2.png differ diff --git a/public/images/pokemon/variant/979_3.png b/public/images/pokemon/variant/979_3.png index ed4407c2a38..2b187754cea 100644 Binary files a/public/images/pokemon/variant/979_3.png and b/public/images/pokemon/variant/979_3.png differ diff --git a/public/images/pokemon/variant/9_2.png b/public/images/pokemon/variant/9_2.png index 216d1423374..a31ea1e073e 100644 Binary files a/public/images/pokemon/variant/9_2.png and b/public/images/pokemon/variant/9_2.png differ diff --git a/public/images/pokemon/variant/9_3.png b/public/images/pokemon/variant/9_3.png index 0f1bce73356..5ef7a8d739e 100644 Binary files a/public/images/pokemon/variant/9_3.png and b/public/images/pokemon/variant/9_3.png differ diff --git a/public/images/pokemon/variant/back/1022_2.png b/public/images/pokemon/variant/back/1022_2.png index 4a59f687da2..cdd94da0af6 100644 Binary files a/public/images/pokemon/variant/back/1022_2.png and b/public/images/pokemon/variant/back/1022_2.png differ diff --git a/public/images/pokemon/variant/back/1022_3.png b/public/images/pokemon/variant/back/1022_3.png index 846ecdd4f73..2d5df98da9d 100644 Binary files a/public/images/pokemon/variant/back/1022_3.png and b/public/images/pokemon/variant/back/1022_3.png differ diff --git a/public/images/pokemon/variant/back/125_3.png b/public/images/pokemon/variant/back/125_3.png index eef852c92e7..68e9503d1cb 100644 Binary files a/public/images/pokemon/variant/back/125_3.png and b/public/images/pokemon/variant/back/125_3.png differ diff --git a/public/images/pokemon/variant/back/126_2.png b/public/images/pokemon/variant/back/126_2.png index 9f22780f1d8..016cb367db3 100644 Binary files a/public/images/pokemon/variant/back/126_2.png and b/public/images/pokemon/variant/back/126_2.png differ diff --git a/public/images/pokemon/variant/back/180_3.png b/public/images/pokemon/variant/back/180_3.png index 82d8d9c0c68..0cf0357f3c0 100644 Binary files a/public/images/pokemon/variant/back/180_3.png and b/public/images/pokemon/variant/back/180_3.png differ diff --git a/public/images/pokemon/variant/back/181-mega_3.png b/public/images/pokemon/variant/back/181-mega_3.png index 5d30a156cbc..17832724081 100644 Binary files a/public/images/pokemon/variant/back/181-mega_3.png and b/public/images/pokemon/variant/back/181-mega_3.png differ diff --git a/public/images/pokemon/variant/back/199_1.png b/public/images/pokemon/variant/back/199_1.png index 004346df151..66d6fa0a4d7 100644 Binary files a/public/images/pokemon/variant/back/199_1.png and b/public/images/pokemon/variant/back/199_1.png differ diff --git a/public/images/pokemon/variant/back/200_2.png b/public/images/pokemon/variant/back/200_2.png index 0702c2596e1..ef296028bb0 100644 Binary files a/public/images/pokemon/variant/back/200_2.png and b/public/images/pokemon/variant/back/200_2.png differ diff --git a/public/images/pokemon/variant/back/200_3.png b/public/images/pokemon/variant/back/200_3.png index 0f7b4a5fd05..f707e04ea86 100644 Binary files a/public/images/pokemon/variant/back/200_3.png and b/public/images/pokemon/variant/back/200_3.png differ diff --git a/public/images/pokemon/variant/back/212-mega_2.png b/public/images/pokemon/variant/back/212-mega_2.png index adf745f6851..d066510353d 100644 Binary files a/public/images/pokemon/variant/back/212-mega_2.png and b/public/images/pokemon/variant/back/212-mega_2.png differ diff --git a/public/images/pokemon/variant/back/212-mega_3.png b/public/images/pokemon/variant/back/212-mega_3.png index 0cfead081c4..f3c4e5bd110 100644 Binary files a/public/images/pokemon/variant/back/212-mega_3.png and b/public/images/pokemon/variant/back/212-mega_3.png differ diff --git a/public/images/pokemon/variant/back/212_2.png b/public/images/pokemon/variant/back/212_2.png index 9f325d62aa9..7a24be11f16 100644 Binary files a/public/images/pokemon/variant/back/212_2.png and b/public/images/pokemon/variant/back/212_2.png differ diff --git a/public/images/pokemon/variant/back/212_3.png b/public/images/pokemon/variant/back/212_3.png index d06a89140c7..a22f1a9d38e 100644 Binary files a/public/images/pokemon/variant/back/212_3.png and b/public/images/pokemon/variant/back/212_3.png differ diff --git a/public/images/pokemon/variant/back/239_3.png b/public/images/pokemon/variant/back/239_3.png index 02a680ff5a7..b5ce88685a7 100644 Binary files a/public/images/pokemon/variant/back/239_3.png and b/public/images/pokemon/variant/back/239_3.png differ diff --git a/public/images/pokemon/variant/back/244_2.png b/public/images/pokemon/variant/back/244_2.png index 6244b6eb74c..968b5c325bd 100644 Binary files a/public/images/pokemon/variant/back/244_2.png and b/public/images/pokemon/variant/back/244_2.png differ diff --git a/public/images/pokemon/variant/back/244_3.png b/public/images/pokemon/variant/back/244_3.png index 7e04e3d6086..323b9a6b337 100644 Binary files a/public/images/pokemon/variant/back/244_3.png and b/public/images/pokemon/variant/back/244_3.png differ diff --git a/public/images/pokemon/variant/back/291_1.png b/public/images/pokemon/variant/back/291_1.png index dad69ed24af..a465af75920 100644 Binary files a/public/images/pokemon/variant/back/291_1.png and b/public/images/pokemon/variant/back/291_1.png differ diff --git a/public/images/pokemon/variant/back/291_2.png b/public/images/pokemon/variant/back/291_2.png index d3005597f60..6eafa03d9d5 100644 Binary files a/public/images/pokemon/variant/back/291_2.png and b/public/images/pokemon/variant/back/291_2.png differ diff --git a/public/images/pokemon/variant/back/291_3.png b/public/images/pokemon/variant/back/291_3.png index 9c62398a5fc..98c0d6c6b63 100644 Binary files a/public/images/pokemon/variant/back/291_3.png and b/public/images/pokemon/variant/back/291_3.png differ diff --git a/public/images/pokemon/variant/back/292_1.png b/public/images/pokemon/variant/back/292_1.png index ae99178d90a..4625db861b3 100644 Binary files a/public/images/pokemon/variant/back/292_1.png and b/public/images/pokemon/variant/back/292_1.png differ diff --git a/public/images/pokemon/variant/back/292_2.png b/public/images/pokemon/variant/back/292_2.png index fc3d4090a1d..c773f10b69d 100644 Binary files a/public/images/pokemon/variant/back/292_2.png and b/public/images/pokemon/variant/back/292_2.png differ diff --git a/public/images/pokemon/variant/back/292_3.png b/public/images/pokemon/variant/back/292_3.png index 1ebe95bb1b5..164d583eb43 100644 Binary files a/public/images/pokemon/variant/back/292_3.png and b/public/images/pokemon/variant/back/292_3.png differ diff --git a/public/images/pokemon/variant/back/3-mega_2.png b/public/images/pokemon/variant/back/3-mega_2.png index 52f8ed7b580..7bb201ef984 100644 Binary files a/public/images/pokemon/variant/back/3-mega_2.png and b/public/images/pokemon/variant/back/3-mega_2.png differ diff --git a/public/images/pokemon/variant/back/3-mega_3.png b/public/images/pokemon/variant/back/3-mega_3.png index 9d964688f14..5d7fb8ad798 100644 Binary files a/public/images/pokemon/variant/back/3-mega_3.png and b/public/images/pokemon/variant/back/3-mega_3.png differ diff --git a/public/images/pokemon/variant/back/335_2.png b/public/images/pokemon/variant/back/335_2.png index e21955c3033..5e23f357767 100644 Binary files a/public/images/pokemon/variant/back/335_2.png and b/public/images/pokemon/variant/back/335_2.png differ diff --git a/public/images/pokemon/variant/back/335_3.png b/public/images/pokemon/variant/back/335_3.png index 3ccd19f715f..407413dca23 100644 Binary files a/public/images/pokemon/variant/back/335_3.png and b/public/images/pokemon/variant/back/335_3.png differ diff --git a/public/images/pokemon/variant/back/339_2.png b/public/images/pokemon/variant/back/339_2.png index 77dc5e5e936..ceed75f36f6 100644 Binary files a/public/images/pokemon/variant/back/339_2.png and b/public/images/pokemon/variant/back/339_2.png differ diff --git a/public/images/pokemon/variant/back/340_3.png b/public/images/pokemon/variant/back/340_3.png index 6d0b7ab033a..771b424564b 100644 Binary files a/public/images/pokemon/variant/back/340_3.png and b/public/images/pokemon/variant/back/340_3.png differ diff --git a/public/images/pokemon/variant/back/342_2.png b/public/images/pokemon/variant/back/342_2.png index 6238027c434..d5138c51fcf 100644 Binary files a/public/images/pokemon/variant/back/342_2.png and b/public/images/pokemon/variant/back/342_2.png differ diff --git a/public/images/pokemon/variant/back/342_3.png b/public/images/pokemon/variant/back/342_3.png index d68f7fd40e8..af788f45bfa 100644 Binary files a/public/images/pokemon/variant/back/342_3.png and b/public/images/pokemon/variant/back/342_3.png differ diff --git a/public/images/pokemon/variant/back/351-sunny_3.png b/public/images/pokemon/variant/back/351-sunny_3.png index 66f1536eb84..059b85417e1 100644 Binary files a/public/images/pokemon/variant/back/351-sunny_3.png and b/public/images/pokemon/variant/back/351-sunny_3.png differ diff --git a/public/images/pokemon/variant/back/369_2.png b/public/images/pokemon/variant/back/369_2.png index 8510afc4eb4..62b37b70738 100644 Binary files a/public/images/pokemon/variant/back/369_2.png and b/public/images/pokemon/variant/back/369_2.png differ diff --git a/public/images/pokemon/variant/back/369_3.png b/public/images/pokemon/variant/back/369_3.png index 165b5ad0199..69cedd6571c 100644 Binary files a/public/images/pokemon/variant/back/369_3.png and b/public/images/pokemon/variant/back/369_3.png differ diff --git a/public/images/pokemon/variant/back/36_2.png b/public/images/pokemon/variant/back/36_2.png index 8b7bb25cc59..f30397b482f 100644 Binary files a/public/images/pokemon/variant/back/36_2.png and b/public/images/pokemon/variant/back/36_2.png differ diff --git a/public/images/pokemon/variant/back/370_2.png b/public/images/pokemon/variant/back/370_2.png index 48e7d90585f..32d49cd89a3 100644 Binary files a/public/images/pokemon/variant/back/370_2.png and b/public/images/pokemon/variant/back/370_2.png differ diff --git a/public/images/pokemon/variant/back/370_3.png b/public/images/pokemon/variant/back/370_3.png index f5a0768f26b..f20b119f333 100644 Binary files a/public/images/pokemon/variant/back/370_3.png and b/public/images/pokemon/variant/back/370_3.png differ diff --git a/public/images/pokemon/variant/back/383_2.png b/public/images/pokemon/variant/back/383_2.png index 98ac154832f..9c280b56dd7 100644 Binary files a/public/images/pokemon/variant/back/383_2.png and b/public/images/pokemon/variant/back/383_2.png differ diff --git a/public/images/pokemon/variant/back/383_3.png b/public/images/pokemon/variant/back/383_3.png index f8856a6aa2d..b754d969e4a 100644 Binary files a/public/images/pokemon/variant/back/383_3.png and b/public/images/pokemon/variant/back/383_3.png differ diff --git a/public/images/pokemon/variant/back/387_2.png b/public/images/pokemon/variant/back/387_2.png index d55cb1c5384..00c947db821 100644 Binary files a/public/images/pokemon/variant/back/387_2.png and b/public/images/pokemon/variant/back/387_2.png differ diff --git a/public/images/pokemon/variant/back/399_2.png b/public/images/pokemon/variant/back/399_2.png index 55ab33679cb..b71497f9ccf 100644 Binary files a/public/images/pokemon/variant/back/399_2.png and b/public/images/pokemon/variant/back/399_2.png differ diff --git a/public/images/pokemon/variant/back/4080_1.png b/public/images/pokemon/variant/back/4080_1.png index 7f6ba3be1c4..885cd8b2c54 100644 Binary files a/public/images/pokemon/variant/back/4080_1.png and b/public/images/pokemon/variant/back/4080_1.png differ diff --git a/public/images/pokemon/variant/back/412-sandy_1.png b/public/images/pokemon/variant/back/412-sandy_1.png index 9dcd4798761..a8988e8ab22 100644 Binary files a/public/images/pokemon/variant/back/412-sandy_1.png and b/public/images/pokemon/variant/back/412-sandy_1.png differ diff --git a/public/images/pokemon/variant/back/412-sandy_2.png b/public/images/pokemon/variant/back/412-sandy_2.png index de7c581bb73..730e0896c92 100644 Binary files a/public/images/pokemon/variant/back/412-sandy_2.png and b/public/images/pokemon/variant/back/412-sandy_2.png differ diff --git a/public/images/pokemon/variant/back/412-sandy_3.png b/public/images/pokemon/variant/back/412-sandy_3.png index 46022a40775..bf2f2f0b94a 100644 Binary files a/public/images/pokemon/variant/back/412-sandy_3.png and b/public/images/pokemon/variant/back/412-sandy_3.png differ diff --git a/public/images/pokemon/variant/back/4199_1.png b/public/images/pokemon/variant/back/4199_1.png index daaac5a6448..45b81fb3413 100644 Binary files a/public/images/pokemon/variant/back/4199_1.png and b/public/images/pokemon/variant/back/4199_1.png differ diff --git a/public/images/pokemon/variant/back/441_3.png b/public/images/pokemon/variant/back/441_3.png index 271e40e3423..3cfa821a8f9 100644 Binary files a/public/images/pokemon/variant/back/441_3.png and b/public/images/pokemon/variant/back/441_3.png differ diff --git a/public/images/pokemon/variant/back/457_2.png b/public/images/pokemon/variant/back/457_2.png index 9168013d2e6..f41fb311b01 100644 Binary files a/public/images/pokemon/variant/back/457_2.png and b/public/images/pokemon/variant/back/457_2.png differ diff --git a/public/images/pokemon/variant/back/458_2.png b/public/images/pokemon/variant/back/458_2.png index 5c1db97b56d..d593fd73842 100644 Binary files a/public/images/pokemon/variant/back/458_2.png and b/public/images/pokemon/variant/back/458_2.png differ diff --git a/public/images/pokemon/variant/back/458_3.png b/public/images/pokemon/variant/back/458_3.png index 7cf9d011c04..605d0dac846 100644 Binary files a/public/images/pokemon/variant/back/458_3.png and b/public/images/pokemon/variant/back/458_3.png differ diff --git a/public/images/pokemon/variant/back/466_1.png b/public/images/pokemon/variant/back/466_1.png index 32f481f6885..eab00428a23 100644 Binary files a/public/images/pokemon/variant/back/466_1.png and b/public/images/pokemon/variant/back/466_1.png differ diff --git a/public/images/pokemon/variant/back/469_2.png b/public/images/pokemon/variant/back/469_2.png index 6e064707bba..b83cf418a57 100644 Binary files a/public/images/pokemon/variant/back/469_2.png and b/public/images/pokemon/variant/back/469_2.png differ diff --git a/public/images/pokemon/variant/back/470_1.png b/public/images/pokemon/variant/back/470_1.png index a156101f2cf..7e64d672b38 100644 Binary files a/public/images/pokemon/variant/back/470_1.png and b/public/images/pokemon/variant/back/470_1.png differ diff --git a/public/images/pokemon/variant/back/470_2.png b/public/images/pokemon/variant/back/470_2.png index 69e75827b0a..f062750b14f 100644 Binary files a/public/images/pokemon/variant/back/470_2.png and b/public/images/pokemon/variant/back/470_2.png differ diff --git a/public/images/pokemon/variant/back/472_3.png b/public/images/pokemon/variant/back/472_3.png index 79b07833534..a6e22d85113 100644 Binary files a/public/images/pokemon/variant/back/472_3.png and b/public/images/pokemon/variant/back/472_3.png differ diff --git a/public/images/pokemon/variant/back/478_2.png b/public/images/pokemon/variant/back/478_2.png index 9d165174556..979bfc9fd11 100644 Binary files a/public/images/pokemon/variant/back/478_2.png and b/public/images/pokemon/variant/back/478_2.png differ diff --git a/public/images/pokemon/variant/back/529_2.png b/public/images/pokemon/variant/back/529_2.png index 06e853c19c2..22d3d5958ba 100644 Binary files a/public/images/pokemon/variant/back/529_2.png and b/public/images/pokemon/variant/back/529_2.png differ diff --git a/public/images/pokemon/variant/back/529_3.png b/public/images/pokemon/variant/back/529_3.png index 935c5788841..8458afd7642 100644 Binary files a/public/images/pokemon/variant/back/529_3.png and b/public/images/pokemon/variant/back/529_3.png differ diff --git a/public/images/pokemon/variant/back/530_3.png b/public/images/pokemon/variant/back/530_3.png index d5b7b9b651b..ec2a1e7cd77 100644 Binary files a/public/images/pokemon/variant/back/530_3.png and b/public/images/pokemon/variant/back/530_3.png differ diff --git a/public/images/pokemon/variant/back/539_2.png b/public/images/pokemon/variant/back/539_2.png index e4bca835949..01956ca440c 100644 Binary files a/public/images/pokemon/variant/back/539_2.png and b/public/images/pokemon/variant/back/539_2.png differ diff --git a/public/images/pokemon/variant/back/539_3.png b/public/images/pokemon/variant/back/539_3.png index fb28b78459c..b4126047a5c 100644 Binary files a/public/images/pokemon/variant/back/539_3.png and b/public/images/pokemon/variant/back/539_3.png differ diff --git a/public/images/pokemon/variant/back/585-autumn_1.png b/public/images/pokemon/variant/back/585-autumn_1.png index 48c5968bff7..147e14fc5fa 100644 Binary files a/public/images/pokemon/variant/back/585-autumn_1.png and b/public/images/pokemon/variant/back/585-autumn_1.png differ diff --git a/public/images/pokemon/variant/back/585-spring_1.png b/public/images/pokemon/variant/back/585-spring_1.png index e3d6d7f75bd..e715844e976 100644 Binary files a/public/images/pokemon/variant/back/585-spring_1.png and b/public/images/pokemon/variant/back/585-spring_1.png differ diff --git a/public/images/pokemon/variant/back/585-winter_1.png b/public/images/pokemon/variant/back/585-winter_1.png index fe85cebd87d..24d991327f7 100644 Binary files a/public/images/pokemon/variant/back/585-winter_1.png and b/public/images/pokemon/variant/back/585-winter_1.png differ diff --git a/public/images/pokemon/variant/back/592_3.png b/public/images/pokemon/variant/back/592_3.png index 88ac9e57362..f7469e36ec6 100644 Binary files a/public/images/pokemon/variant/back/592_3.png and b/public/images/pokemon/variant/back/592_3.png differ diff --git a/public/images/pokemon/variant/back/594_3.png b/public/images/pokemon/variant/back/594_3.png index 9e4215d42b7..4f1c28d8335 100644 Binary files a/public/images/pokemon/variant/back/594_3.png and b/public/images/pokemon/variant/back/594_3.png differ diff --git a/public/images/pokemon/variant/back/618_2.png b/public/images/pokemon/variant/back/618_2.png index e74c6db3f04..a0077a1f023 100644 Binary files a/public/images/pokemon/variant/back/618_2.png and b/public/images/pokemon/variant/back/618_2.png differ diff --git a/public/images/pokemon/variant/back/631_2.png b/public/images/pokemon/variant/back/631_2.png index d5d6af70546..b3cee0d8baa 100644 Binary files a/public/images/pokemon/variant/back/631_2.png and b/public/images/pokemon/variant/back/631_2.png differ diff --git a/public/images/pokemon/variant/back/631_3.png b/public/images/pokemon/variant/back/631_3.png index bb029fd7f3c..a052b6ea4b1 100644 Binary files a/public/images/pokemon/variant/back/631_3.png and b/public/images/pokemon/variant/back/631_3.png differ diff --git a/public/images/pokemon/variant/back/666-fancy_2.png b/public/images/pokemon/variant/back/666-fancy_2.png index d51a6403f3b..a1e23edd659 100644 Binary files a/public/images/pokemon/variant/back/666-fancy_2.png and b/public/images/pokemon/variant/back/666-fancy_2.png differ diff --git a/public/images/pokemon/variant/back/666-fancy_3.png b/public/images/pokemon/variant/back/666-fancy_3.png index aeca21cbeb5..6d15bc3f680 100644 Binary files a/public/images/pokemon/variant/back/666-fancy_3.png and b/public/images/pokemon/variant/back/666-fancy_3.png differ diff --git a/public/images/pokemon/variant/back/666-river_2.png b/public/images/pokemon/variant/back/666-river_2.png index 06c1b09d749..8d829e974f4 100644 Binary files a/public/images/pokemon/variant/back/666-river_2.png and b/public/images/pokemon/variant/back/666-river_2.png differ diff --git a/public/images/pokemon/variant/back/696_3.png b/public/images/pokemon/variant/back/696_3.png index 87dc6ff576c..76bced189af 100644 Binary files a/public/images/pokemon/variant/back/696_3.png and b/public/images/pokemon/variant/back/696_3.png differ diff --git a/public/images/pokemon/variant/back/697_3.png b/public/images/pokemon/variant/back/697_3.png index 430bde3ae6d..cea5cfb6830 100644 Binary files a/public/images/pokemon/variant/back/697_3.png and b/public/images/pokemon/variant/back/697_3.png differ diff --git a/public/images/pokemon/variant/back/715_2.png b/public/images/pokemon/variant/back/715_2.png index 91bebbc7e58..d9e04847334 100644 Binary files a/public/images/pokemon/variant/back/715_2.png and b/public/images/pokemon/variant/back/715_2.png differ diff --git a/public/images/pokemon/variant/back/715_3.png b/public/images/pokemon/variant/back/715_3.png index 123e9a7fa1d..11069652972 100644 Binary files a/public/images/pokemon/variant/back/715_3.png and b/public/images/pokemon/variant/back/715_3.png differ diff --git a/public/images/pokemon/variant/back/742_2.png b/public/images/pokemon/variant/back/742_2.png index 955cd3514ae..cfcc6c31f20 100644 Binary files a/public/images/pokemon/variant/back/742_2.png and b/public/images/pokemon/variant/back/742_2.png differ diff --git a/public/images/pokemon/variant/back/742_3.png b/public/images/pokemon/variant/back/742_3.png index a42604a6b56..a8157351738 100644 Binary files a/public/images/pokemon/variant/back/742_3.png and b/public/images/pokemon/variant/back/742_3.png differ diff --git a/public/images/pokemon/variant/back/743_2.png b/public/images/pokemon/variant/back/743_2.png index 983addac875..3e90381dcc1 100644 Binary files a/public/images/pokemon/variant/back/743_2.png and b/public/images/pokemon/variant/back/743_2.png differ diff --git a/public/images/pokemon/variant/back/743_3.png b/public/images/pokemon/variant/back/743_3.png index b892f735a5b..03d5b2719ff 100644 Binary files a/public/images/pokemon/variant/back/743_3.png and b/public/images/pokemon/variant/back/743_3.png differ diff --git a/public/images/pokemon/variant/back/754_2.png b/public/images/pokemon/variant/back/754_2.png index 234f96b9f45..af52b9c5f44 100644 Binary files a/public/images/pokemon/variant/back/754_2.png and b/public/images/pokemon/variant/back/754_2.png differ diff --git a/public/images/pokemon/variant/back/754_3.png b/public/images/pokemon/variant/back/754_3.png index 7a99986e40e..e00a2353a60 100644 Binary files a/public/images/pokemon/variant/back/754_3.png and b/public/images/pokemon/variant/back/754_3.png differ diff --git a/public/images/pokemon/variant/back/791_1.png b/public/images/pokemon/variant/back/791_1.png index 9d5da99ce5c..647884de128 100644 Binary files a/public/images/pokemon/variant/back/791_1.png and b/public/images/pokemon/variant/back/791_1.png differ diff --git a/public/images/pokemon/variant/back/7_2.png b/public/images/pokemon/variant/back/7_2.png index 7f0970f95bc..1deb4d30f61 100644 Binary files a/public/images/pokemon/variant/back/7_2.png and b/public/images/pokemon/variant/back/7_2.png differ diff --git a/public/images/pokemon/variant/back/7_3.png b/public/images/pokemon/variant/back/7_3.png index 2758617eea9..8111d99023e 100644 Binary files a/public/images/pokemon/variant/back/7_3.png and b/public/images/pokemon/variant/back/7_3.png differ diff --git a/public/images/pokemon/variant/back/823-gigantamax_2.png b/public/images/pokemon/variant/back/823-gigantamax_2.png index 7ccc99014a6..d37529893d9 100644 Binary files a/public/images/pokemon/variant/back/823-gigantamax_2.png and b/public/images/pokemon/variant/back/823-gigantamax_2.png differ diff --git a/public/images/pokemon/variant/back/823-gigantamax_3.png b/public/images/pokemon/variant/back/823-gigantamax_3.png index a85e9813268..9b329a4d6f6 100644 Binary files a/public/images/pokemon/variant/back/823-gigantamax_3.png and b/public/images/pokemon/variant/back/823-gigantamax_3.png differ diff --git a/public/images/pokemon/variant/back/83_2.png b/public/images/pokemon/variant/back/83_2.png index 3dda813cf92..103155eb387 100644 Binary files a/public/images/pokemon/variant/back/83_2.png and b/public/images/pokemon/variant/back/83_2.png differ diff --git a/public/images/pokemon/variant/back/83_3.png b/public/images/pokemon/variant/back/83_3.png index b8de9d82cc7..e06e48e577f 100644 Binary files a/public/images/pokemon/variant/back/83_3.png and b/public/images/pokemon/variant/back/83_3.png differ diff --git a/public/images/pokemon/variant/back/857_2.png b/public/images/pokemon/variant/back/857_2.png index bbc09762342..2481e0b825f 100644 Binary files a/public/images/pokemon/variant/back/857_2.png and b/public/images/pokemon/variant/back/857_2.png differ diff --git a/public/images/pokemon/variant/back/857_3.png b/public/images/pokemon/variant/back/857_3.png index 9f77ff938c6..0b14194a26f 100644 Binary files a/public/images/pokemon/variant/back/857_3.png and b/public/images/pokemon/variant/back/857_3.png differ diff --git a/public/images/pokemon/variant/back/862_2.png b/public/images/pokemon/variant/back/862_2.png index 705898eb9a7..1a79d39d63f 100644 Binary files a/public/images/pokemon/variant/back/862_2.png and b/public/images/pokemon/variant/back/862_2.png differ diff --git a/public/images/pokemon/variant/back/862_3.png b/public/images/pokemon/variant/back/862_3.png index 92f81bfe220..d8e6d2b5639 100644 Binary files a/public/images/pokemon/variant/back/862_3.png and b/public/images/pokemon/variant/back/862_3.png differ diff --git a/public/images/pokemon/variant/back/881_2.png b/public/images/pokemon/variant/back/881_2.png index 76176d7d5fe..2060481d855 100644 Binary files a/public/images/pokemon/variant/back/881_2.png and b/public/images/pokemon/variant/back/881_2.png differ diff --git a/public/images/pokemon/variant/back/881_3.png b/public/images/pokemon/variant/back/881_3.png index c255e83cc16..6ed3c2495ba 100644 Binary files a/public/images/pokemon/variant/back/881_3.png and b/public/images/pokemon/variant/back/881_3.png differ diff --git a/public/images/pokemon/variant/back/8_2.png b/public/images/pokemon/variant/back/8_2.png index d0171dd1bdc..8c3605eb75b 100644 Binary files a/public/images/pokemon/variant/back/8_2.png and b/public/images/pokemon/variant/back/8_2.png differ diff --git a/public/images/pokemon/variant/back/8_3.png b/public/images/pokemon/variant/back/8_3.png index ea7724838db..c74f82777ce 100644 Binary files a/public/images/pokemon/variant/back/8_3.png and b/public/images/pokemon/variant/back/8_3.png differ diff --git a/public/images/pokemon/variant/back/9-gigantamax_3.png b/public/images/pokemon/variant/back/9-gigantamax_3.png index c98249e14d5..444264fa4fd 100644 Binary files a/public/images/pokemon/variant/back/9-gigantamax_3.png and b/public/images/pokemon/variant/back/9-gigantamax_3.png differ diff --git a/public/images/pokemon/variant/back/9-mega_2.png b/public/images/pokemon/variant/back/9-mega_2.png index e961ace2e5c..02987564bea 100644 Binary files a/public/images/pokemon/variant/back/9-mega_2.png and b/public/images/pokemon/variant/back/9-mega_2.png differ diff --git a/public/images/pokemon/variant/back/9-mega_3.png b/public/images/pokemon/variant/back/9-mega_3.png index 95a7babe58b..00150d4dd46 100644 Binary files a/public/images/pokemon/variant/back/9-mega_3.png and b/public/images/pokemon/variant/back/9-mega_3.png differ diff --git a/public/images/pokemon/variant/back/910_2.png b/public/images/pokemon/variant/back/910_2.png index 4efa5be2565..8c4dd643574 100644 Binary files a/public/images/pokemon/variant/back/910_2.png and b/public/images/pokemon/variant/back/910_2.png differ diff --git a/public/images/pokemon/variant/back/910_3.png b/public/images/pokemon/variant/back/910_3.png index c5f4b605dcb..ad622de11a4 100644 Binary files a/public/images/pokemon/variant/back/910_3.png and b/public/images/pokemon/variant/back/910_3.png differ diff --git a/public/images/pokemon/variant/back/92_1.png b/public/images/pokemon/variant/back/92_1.png index 20faf4213ca..96a70ecbf7b 100644 Binary files a/public/images/pokemon/variant/back/92_1.png and b/public/images/pokemon/variant/back/92_1.png differ diff --git a/public/images/pokemon/variant/back/92_2.png b/public/images/pokemon/variant/back/92_2.png index 6a7e13cc25e..711ece9d98b 100644 Binary files a/public/images/pokemon/variant/back/92_2.png and b/public/images/pokemon/variant/back/92_2.png differ diff --git a/public/images/pokemon/variant/back/92_3.png b/public/images/pokemon/variant/back/92_3.png index df995a87d55..918e0ee35f8 100644 Binary files a/public/images/pokemon/variant/back/92_3.png and b/public/images/pokemon/variant/back/92_3.png differ diff --git a/public/images/pokemon/variant/back/970_2.png b/public/images/pokemon/variant/back/970_2.png index 2e07eb2fb07..4f3a7eb76ef 100644 Binary files a/public/images/pokemon/variant/back/970_2.png and b/public/images/pokemon/variant/back/970_2.png differ diff --git a/public/images/pokemon/variant/back/978-curly_2.png b/public/images/pokemon/variant/back/978-curly_2.png index 4a5ede3e81a..70bde1acb2f 100644 Binary files a/public/images/pokemon/variant/back/978-curly_2.png and b/public/images/pokemon/variant/back/978-curly_2.png differ diff --git a/public/images/pokemon/variant/back/978-curly_3.png b/public/images/pokemon/variant/back/978-curly_3.png index af6d8a8aa33..877dbbaee6f 100644 Binary files a/public/images/pokemon/variant/back/978-curly_3.png and b/public/images/pokemon/variant/back/978-curly_3.png differ diff --git a/public/images/pokemon/variant/back/978-droopy_2.png b/public/images/pokemon/variant/back/978-droopy_2.png index 23e1b955d4d..7259f4e5635 100644 Binary files a/public/images/pokemon/variant/back/978-droopy_2.png and b/public/images/pokemon/variant/back/978-droopy_2.png differ diff --git a/public/images/pokemon/variant/back/978-droopy_3.png b/public/images/pokemon/variant/back/978-droopy_3.png index 6255349f590..9ba70e6d395 100644 Binary files a/public/images/pokemon/variant/back/978-droopy_3.png and b/public/images/pokemon/variant/back/978-droopy_3.png differ diff --git a/public/images/pokemon/variant/back/982-three-segment_3.png b/public/images/pokemon/variant/back/982-three-segment_3.png index 3286d3331a5..ed5d835ab16 100644 Binary files a/public/images/pokemon/variant/back/982-three-segment_3.png and b/public/images/pokemon/variant/back/982-three-segment_3.png differ diff --git a/public/images/pokemon/variant/back/982_3.png b/public/images/pokemon/variant/back/982_3.png index b6b0ef0c2f4..0c8766b59cb 100644 Binary files a/public/images/pokemon/variant/back/982_3.png and b/public/images/pokemon/variant/back/982_3.png differ diff --git a/public/images/pokemon/variant/back/9_2.png b/public/images/pokemon/variant/back/9_2.png index a55c0c139fb..409472b2e52 100644 Binary files a/public/images/pokemon/variant/back/9_2.png and b/public/images/pokemon/variant/back/9_2.png differ diff --git a/public/images/pokemon/variant/back/9_3.png b/public/images/pokemon/variant/back/9_3.png index edae3f66b71..2cb0b1a3917 100644 Binary files a/public/images/pokemon/variant/back/9_3.png and b/public/images/pokemon/variant/back/9_3.png differ diff --git a/public/images/pokemon/variant/back/female/399_2.png b/public/images/pokemon/variant/back/female/399_2.png index fcd948a0ef9..b71497f9ccf 100644 Binary files a/public/images/pokemon/variant/back/female/399_2.png and b/public/images/pokemon/variant/back/female/399_2.png differ diff --git a/public/images/pokemon/variant/back/female/418_2.png b/public/images/pokemon/variant/back/female/418_2.png index fc6ad0362df..03a1b2b7dd4 100644 Binary files a/public/images/pokemon/variant/back/female/418_2.png and b/public/images/pokemon/variant/back/female/418_2.png differ diff --git a/public/images/pokemon/variant/back/female/418_3.png b/public/images/pokemon/variant/back/female/418_3.png index a9051456db9..faf166b7184 100644 Binary files a/public/images/pokemon/variant/back/female/418_3.png and b/public/images/pokemon/variant/back/female/418_3.png differ diff --git a/public/images/pokemon/variant/back/female/41_2.png b/public/images/pokemon/variant/back/female/41_2.png index bd1e22238cc..4fdb671c61a 100644 Binary files a/public/images/pokemon/variant/back/female/41_2.png and b/public/images/pokemon/variant/back/female/41_2.png differ diff --git a/public/images/pokemon/variant/back/female/41_3.png b/public/images/pokemon/variant/back/female/41_3.png index fec4f49c599..f494bd5b07e 100644 Binary files a/public/images/pokemon/variant/back/female/41_3.png and b/public/images/pokemon/variant/back/female/41_3.png differ diff --git a/public/images/pokemon/variant/back/female/42_2.png b/public/images/pokemon/variant/back/female/42_2.png index 61360275ca1..2fa196d973a 100644 Binary files a/public/images/pokemon/variant/back/female/42_2.png and b/public/images/pokemon/variant/back/female/42_2.png differ diff --git a/public/images/pokemon/variant/back/female/42_3.png b/public/images/pokemon/variant/back/female/42_3.png index bd86c83f3c0..4e88627d6b6 100644 Binary files a/public/images/pokemon/variant/back/female/42_3.png and b/public/images/pokemon/variant/back/female/42_3.png differ diff --git a/public/images/pokemon/variant/exp/181-mega_3.png b/public/images/pokemon/variant/exp/181-mega_3.png index 2e88beea872..7172bc45244 100644 Binary files a/public/images/pokemon/variant/exp/181-mega_3.png and b/public/images/pokemon/variant/exp/181-mega_3.png differ diff --git a/public/images/pokemon/variant/exp/212-mega_2.png b/public/images/pokemon/variant/exp/212-mega_2.png index d08116555cd..2665dfbc253 100644 Binary files a/public/images/pokemon/variant/exp/212-mega_2.png and b/public/images/pokemon/variant/exp/212-mega_2.png differ diff --git a/public/images/pokemon/variant/exp/212-mega_3.png b/public/images/pokemon/variant/exp/212-mega_3.png index c93db623fda..75226e68010 100644 Binary files a/public/images/pokemon/variant/exp/212-mega_3.png and b/public/images/pokemon/variant/exp/212-mega_3.png differ diff --git a/public/images/pokemon/variant/exp/3-mega_2.png b/public/images/pokemon/variant/exp/3-mega_2.png index 97dce2ae673..b9cb20aba0a 100644 Binary files a/public/images/pokemon/variant/exp/3-mega_2.png and b/public/images/pokemon/variant/exp/3-mega_2.png differ diff --git a/public/images/pokemon/variant/exp/3-mega_3.png b/public/images/pokemon/variant/exp/3-mega_3.png index 277b3c82082..ddd1e998130 100644 Binary files a/public/images/pokemon/variant/exp/3-mega_3.png and b/public/images/pokemon/variant/exp/3-mega_3.png differ diff --git a/public/images/pokemon/variant/exp/334-mega_2.png b/public/images/pokemon/variant/exp/334-mega_2.png index 7a6fdb20cf2..9588df214d0 100644 Binary files a/public/images/pokemon/variant/exp/334-mega_2.png and b/public/images/pokemon/variant/exp/334-mega_2.png differ diff --git a/public/images/pokemon/variant/exp/384-mega_2.png b/public/images/pokemon/variant/exp/384-mega_2.png index dc03a7ba8e2..57ed787e8da 100644 Binary files a/public/images/pokemon/variant/exp/384-mega_2.png and b/public/images/pokemon/variant/exp/384-mega_2.png differ diff --git a/public/images/pokemon/variant/exp/4080_1.png b/public/images/pokemon/variant/exp/4080_1.png index a7e6de6cff7..aad11f1dd4a 100644 Binary files a/public/images/pokemon/variant/exp/4080_1.png and b/public/images/pokemon/variant/exp/4080_1.png differ diff --git a/public/images/pokemon/variant/exp/4199_1.png b/public/images/pokemon/variant/exp/4199_1.png index 4ad5b00b4c7..0a22d90da05 100644 Binary files a/public/images/pokemon/variant/exp/4199_1.png and b/public/images/pokemon/variant/exp/4199_1.png differ diff --git a/public/images/pokemon/variant/exp/666-fancy_2.png b/public/images/pokemon/variant/exp/666-fancy_2.png index df1343095d0..68af4d0a07a 100644 Binary files a/public/images/pokemon/variant/exp/666-fancy_2.png and b/public/images/pokemon/variant/exp/666-fancy_2.png differ diff --git a/public/images/pokemon/variant/exp/666-fancy_3.png b/public/images/pokemon/variant/exp/666-fancy_3.png index 4a48c5cc236..a8e39976f2a 100644 Binary files a/public/images/pokemon/variant/exp/666-fancy_3.png and b/public/images/pokemon/variant/exp/666-fancy_3.png differ diff --git a/public/images/pokemon/variant/exp/666-meadow_2.png b/public/images/pokemon/variant/exp/666-meadow_2.png index 5ada6bb51be..8aada72636f 100644 Binary files a/public/images/pokemon/variant/exp/666-meadow_2.png and b/public/images/pokemon/variant/exp/666-meadow_2.png differ diff --git a/public/images/pokemon/variant/exp/666-meadow_3.png b/public/images/pokemon/variant/exp/666-meadow_3.png index 2acb4732409..146ea5e2ba9 100644 Binary files a/public/images/pokemon/variant/exp/666-meadow_3.png and b/public/images/pokemon/variant/exp/666-meadow_3.png differ diff --git a/public/images/pokemon/variant/exp/666-poke-ball_3.png b/public/images/pokemon/variant/exp/666-poke-ball_3.png index 9e821efd1eb..767a55ab849 100644 Binary files a/public/images/pokemon/variant/exp/666-poke-ball_3.png and b/public/images/pokemon/variant/exp/666-poke-ball_3.png differ diff --git a/public/images/pokemon/variant/exp/666-river_2.png b/public/images/pokemon/variant/exp/666-river_2.png index 7dc96690328..863acbbdc76 100644 Binary files a/public/images/pokemon/variant/exp/666-river_2.png and b/public/images/pokemon/variant/exp/666-river_2.png differ diff --git a/public/images/pokemon/variant/exp/696_2.png b/public/images/pokemon/variant/exp/696_2.png index 031589b4c30..cfc40b59d39 100644 Binary files a/public/images/pokemon/variant/exp/696_2.png and b/public/images/pokemon/variant/exp/696_2.png differ diff --git a/public/images/pokemon/variant/exp/696_3.png b/public/images/pokemon/variant/exp/696_3.png index 8ec6baa4724..647aba679f6 100644 Binary files a/public/images/pokemon/variant/exp/696_3.png and b/public/images/pokemon/variant/exp/696_3.png differ diff --git a/public/images/pokemon/variant/exp/697_3.png b/public/images/pokemon/variant/exp/697_3.png index f58c494a094..b18579c9494 100644 Binary files a/public/images/pokemon/variant/exp/697_3.png and b/public/images/pokemon/variant/exp/697_3.png differ diff --git a/public/images/pokemon/variant/exp/715_2.png b/public/images/pokemon/variant/exp/715_2.png index 4383b8917ae..22fb386440a 100644 Binary files a/public/images/pokemon/variant/exp/715_2.png and b/public/images/pokemon/variant/exp/715_2.png differ diff --git a/public/images/pokemon/variant/exp/717_2.png b/public/images/pokemon/variant/exp/717_2.png index 30b5a9863de..3e11dfa8837 100644 Binary files a/public/images/pokemon/variant/exp/717_2.png and b/public/images/pokemon/variant/exp/717_2.png differ diff --git a/public/images/pokemon/variant/exp/717_3.png b/public/images/pokemon/variant/exp/717_3.png index ad17cdd305f..e39ddfc55d0 100644 Binary files a/public/images/pokemon/variant/exp/717_3.png and b/public/images/pokemon/variant/exp/717_3.png differ diff --git a/public/images/pokemon/variant/exp/729_2.png b/public/images/pokemon/variant/exp/729_2.png index c5c309dbaee..8349e63c91a 100644 Binary files a/public/images/pokemon/variant/exp/729_2.png and b/public/images/pokemon/variant/exp/729_2.png differ diff --git a/public/images/pokemon/variant/exp/729_3.png b/public/images/pokemon/variant/exp/729_3.png index 75a11c74cdc..a4b4197f18a 100644 Binary files a/public/images/pokemon/variant/exp/729_3.png and b/public/images/pokemon/variant/exp/729_3.png differ diff --git a/public/images/pokemon/variant/exp/730_2.png b/public/images/pokemon/variant/exp/730_2.png index f2ef5220ea9..f7a1b20a9be 100644 Binary files a/public/images/pokemon/variant/exp/730_2.png and b/public/images/pokemon/variant/exp/730_2.png differ diff --git a/public/images/pokemon/variant/exp/742_2.png b/public/images/pokemon/variant/exp/742_2.png index a2a238353ea..d4495c7b805 100644 Binary files a/public/images/pokemon/variant/exp/742_2.png and b/public/images/pokemon/variant/exp/742_2.png differ diff --git a/public/images/pokemon/variant/exp/742_3.png b/public/images/pokemon/variant/exp/742_3.png index a4c4f372972..8d55c3263b0 100644 Binary files a/public/images/pokemon/variant/exp/742_3.png and b/public/images/pokemon/variant/exp/742_3.png differ diff --git a/public/images/pokemon/variant/exp/743_2.png b/public/images/pokemon/variant/exp/743_2.png index dae1418901d..6236408f2ca 100644 Binary files a/public/images/pokemon/variant/exp/743_2.png and b/public/images/pokemon/variant/exp/743_2.png differ diff --git a/public/images/pokemon/variant/exp/743_3.png b/public/images/pokemon/variant/exp/743_3.png index 99d6ae3763e..2759946a0fd 100644 Binary files a/public/images/pokemon/variant/exp/743_3.png and b/public/images/pokemon/variant/exp/743_3.png differ diff --git a/public/images/pokemon/variant/exp/747_2.png b/public/images/pokemon/variant/exp/747_2.png index cf3832c9236..5afb5dbe45e 100644 Binary files a/public/images/pokemon/variant/exp/747_2.png and b/public/images/pokemon/variant/exp/747_2.png differ diff --git a/public/images/pokemon/variant/exp/747_3.png b/public/images/pokemon/variant/exp/747_3.png index 9fd3b92aa3e..ceb750efe0c 100644 Binary files a/public/images/pokemon/variant/exp/747_3.png and b/public/images/pokemon/variant/exp/747_3.png differ diff --git a/public/images/pokemon/variant/exp/754_2.png b/public/images/pokemon/variant/exp/754_2.png index fc7e9eadac6..c1c55966656 100644 Binary files a/public/images/pokemon/variant/exp/754_2.png and b/public/images/pokemon/variant/exp/754_2.png differ diff --git a/public/images/pokemon/variant/exp/754_3.png b/public/images/pokemon/variant/exp/754_3.png index c9ad7c5d4ca..dca99a4eb83 100644 Binary files a/public/images/pokemon/variant/exp/754_3.png and b/public/images/pokemon/variant/exp/754_3.png differ diff --git a/public/images/pokemon/variant/exp/771_2.png b/public/images/pokemon/variant/exp/771_2.png index ec47015842d..f2059e6a8eb 100644 Binary files a/public/images/pokemon/variant/exp/771_2.png and b/public/images/pokemon/variant/exp/771_2.png differ diff --git a/public/images/pokemon/variant/exp/771_3.png b/public/images/pokemon/variant/exp/771_3.png index 4a0ac89ac2e..9016079d1cb 100644 Binary files a/public/images/pokemon/variant/exp/771_3.png and b/public/images/pokemon/variant/exp/771_3.png differ diff --git a/public/images/pokemon/variant/exp/791_1.png b/public/images/pokemon/variant/exp/791_1.png index 6c337194ec3..4d5f210ec9f 100644 Binary files a/public/images/pokemon/variant/exp/791_1.png and b/public/images/pokemon/variant/exp/791_1.png differ diff --git a/public/images/pokemon/variant/exp/793_2.png b/public/images/pokemon/variant/exp/793_2.png index 9c70c5a94ee..13f22cffdda 100644 Binary files a/public/images/pokemon/variant/exp/793_2.png and b/public/images/pokemon/variant/exp/793_2.png differ diff --git a/public/images/pokemon/variant/exp/793_3.png b/public/images/pokemon/variant/exp/793_3.png index a758fcb28a4..137cdd97d6d 100644 Binary files a/public/images/pokemon/variant/exp/793_3.png and b/public/images/pokemon/variant/exp/793_3.png differ diff --git a/public/images/pokemon/variant/exp/821_2.png b/public/images/pokemon/variant/exp/821_2.png index 5de24ec92a2..84bb53c19ff 100644 Binary files a/public/images/pokemon/variant/exp/821_2.png and b/public/images/pokemon/variant/exp/821_2.png differ diff --git a/public/images/pokemon/variant/exp/821_3.png b/public/images/pokemon/variant/exp/821_3.png index 7c2bd32a288..eab0bca889f 100644 Binary files a/public/images/pokemon/variant/exp/821_3.png and b/public/images/pokemon/variant/exp/821_3.png differ diff --git a/public/images/pokemon/variant/exp/836_2.png b/public/images/pokemon/variant/exp/836_2.png index 9729f1dd4cf..2961e1015a9 100644 Binary files a/public/images/pokemon/variant/exp/836_2.png and b/public/images/pokemon/variant/exp/836_2.png differ diff --git a/public/images/pokemon/variant/exp/836_3.png b/public/images/pokemon/variant/exp/836_3.png index 76caf187b4d..a48d218ed98 100644 Binary files a/public/images/pokemon/variant/exp/836_3.png and b/public/images/pokemon/variant/exp/836_3.png differ diff --git a/public/images/pokemon/variant/exp/857_2.png b/public/images/pokemon/variant/exp/857_2.png index 2a60b21cef0..c98f602a8e5 100644 Binary files a/public/images/pokemon/variant/exp/857_2.png and b/public/images/pokemon/variant/exp/857_2.png differ diff --git a/public/images/pokemon/variant/exp/857_3.png b/public/images/pokemon/variant/exp/857_3.png index f9e25f22cc4..1b5f73c35de 100644 Binary files a/public/images/pokemon/variant/exp/857_3.png and b/public/images/pokemon/variant/exp/857_3.png differ diff --git a/public/images/pokemon/variant/exp/862_2.png b/public/images/pokemon/variant/exp/862_2.png index 1ed022bfdf7..d97613e5e89 100644 Binary files a/public/images/pokemon/variant/exp/862_2.png and b/public/images/pokemon/variant/exp/862_2.png differ diff --git a/public/images/pokemon/variant/exp/862_3.png b/public/images/pokemon/variant/exp/862_3.png index 79fb464d72f..9f6857d961a 100644 Binary files a/public/images/pokemon/variant/exp/862_3.png and b/public/images/pokemon/variant/exp/862_3.png differ diff --git a/public/images/pokemon/variant/exp/882_2.png b/public/images/pokemon/variant/exp/882_2.png index a702a507f22..fa0c3825cc1 100644 Binary files a/public/images/pokemon/variant/exp/882_2.png and b/public/images/pokemon/variant/exp/882_2.png differ diff --git a/public/images/pokemon/variant/exp/890-eternamax_2.png b/public/images/pokemon/variant/exp/890-eternamax_2.png index b234ec88e16..2327900b971 100644 Binary files a/public/images/pokemon/variant/exp/890-eternamax_2.png and b/public/images/pokemon/variant/exp/890-eternamax_2.png differ diff --git a/public/images/pokemon/variant/exp/890-eternamax_3.png b/public/images/pokemon/variant/exp/890-eternamax_3.png index f24e74283c5..140837cfbd0 100644 Binary files a/public/images/pokemon/variant/exp/890-eternamax_3.png and b/public/images/pokemon/variant/exp/890-eternamax_3.png differ diff --git a/public/images/pokemon/variant/exp/890_2.png b/public/images/pokemon/variant/exp/890_2.png index 036ee01f676..2412e5f95d9 100644 Binary files a/public/images/pokemon/variant/exp/890_2.png and b/public/images/pokemon/variant/exp/890_2.png differ diff --git a/public/images/pokemon/variant/exp/890_3.png b/public/images/pokemon/variant/exp/890_3.png index fb757ecc5cd..855b646e514 100644 Binary files a/public/images/pokemon/variant/exp/890_3.png and b/public/images/pokemon/variant/exp/890_3.png differ diff --git a/public/images/pokemon/variant/exp/9-mega_2.png b/public/images/pokemon/variant/exp/9-mega_2.png index c3c06c1eca7..0a56f1a3a68 100644 Binary files a/public/images/pokemon/variant/exp/9-mega_2.png and b/public/images/pokemon/variant/exp/9-mega_2.png differ diff --git a/public/images/pokemon/variant/exp/9-mega_3.png b/public/images/pokemon/variant/exp/9-mega_3.png index d7a4b6f9140..606f18d6337 100644 Binary files a/public/images/pokemon/variant/exp/9-mega_3.png and b/public/images/pokemon/variant/exp/9-mega_3.png differ diff --git a/public/images/pokemon/variant/exp/910_2.png b/public/images/pokemon/variant/exp/910_2.png index 47dfe4ac7b0..751585f5b0b 100644 Binary files a/public/images/pokemon/variant/exp/910_2.png and b/public/images/pokemon/variant/exp/910_2.png differ diff --git a/public/images/pokemon/variant/exp/910_3.png b/public/images/pokemon/variant/exp/910_3.png index 3206742c7d8..39b728c4350 100644 Binary files a/public/images/pokemon/variant/exp/910_3.png and b/public/images/pokemon/variant/exp/910_3.png differ diff --git a/public/images/pokemon/variant/exp/911_2.png b/public/images/pokemon/variant/exp/911_2.png index 78cf3658061..af9f0237ccf 100644 Binary files a/public/images/pokemon/variant/exp/911_2.png and b/public/images/pokemon/variant/exp/911_2.png differ diff --git a/public/images/pokemon/variant/exp/911_3.png b/public/images/pokemon/variant/exp/911_3.png index d4c2e86b7d7..4280cbdc4a3 100644 Binary files a/public/images/pokemon/variant/exp/911_3.png and b/public/images/pokemon/variant/exp/911_3.png differ diff --git a/public/images/pokemon/variant/exp/912_3.png b/public/images/pokemon/variant/exp/912_3.png index 846915f851e..211af0da412 100644 Binary files a/public/images/pokemon/variant/exp/912_3.png and b/public/images/pokemon/variant/exp/912_3.png differ diff --git a/public/images/pokemon/variant/exp/913_3.png b/public/images/pokemon/variant/exp/913_3.png index acb749c995d..f18a8e917eb 100644 Binary files a/public/images/pokemon/variant/exp/913_3.png and b/public/images/pokemon/variant/exp/913_3.png differ diff --git a/public/images/pokemon/variant/exp/914_2.png b/public/images/pokemon/variant/exp/914_2.png index 08093e2b50b..66aa120f002 100644 Binary files a/public/images/pokemon/variant/exp/914_2.png and b/public/images/pokemon/variant/exp/914_2.png differ diff --git a/public/images/pokemon/variant/exp/925-four_2.png b/public/images/pokemon/variant/exp/925-four_2.png index 1a6403a6673..3a2f00f0606 100644 Binary files a/public/images/pokemon/variant/exp/925-four_2.png and b/public/images/pokemon/variant/exp/925-four_2.png differ diff --git a/public/images/pokemon/variant/exp/925-four_3.png b/public/images/pokemon/variant/exp/925-four_3.png index 41972571610..51496f55c18 100644 Binary files a/public/images/pokemon/variant/exp/925-four_3.png and b/public/images/pokemon/variant/exp/925-four_3.png differ diff --git a/public/images/pokemon/variant/exp/925-three_2.png b/public/images/pokemon/variant/exp/925-three_2.png index 2bfb7863223..f571d24f033 100644 Binary files a/public/images/pokemon/variant/exp/925-three_2.png and b/public/images/pokemon/variant/exp/925-three_2.png differ diff --git a/public/images/pokemon/variant/exp/925-three_3.png b/public/images/pokemon/variant/exp/925-three_3.png index 0b9a4ae7fc5..e6c54ceb519 100644 Binary files a/public/images/pokemon/variant/exp/925-three_3.png and b/public/images/pokemon/variant/exp/925-three_3.png differ diff --git a/public/images/pokemon/variant/exp/936_1.png b/public/images/pokemon/variant/exp/936_1.png index 980f82162ec..cdc333ab841 100644 Binary files a/public/images/pokemon/variant/exp/936_1.png and b/public/images/pokemon/variant/exp/936_1.png differ diff --git a/public/images/pokemon/variant/exp/936_3.png b/public/images/pokemon/variant/exp/936_3.png index 9a9b984a6ab..27874a25886 100644 Binary files a/public/images/pokemon/variant/exp/936_3.png and b/public/images/pokemon/variant/exp/936_3.png differ diff --git a/public/images/pokemon/variant/exp/937_1.png b/public/images/pokemon/variant/exp/937_1.png index 53fff3c074b..82fa70b0c5b 100644 Binary files a/public/images/pokemon/variant/exp/937_1.png and b/public/images/pokemon/variant/exp/937_1.png differ diff --git a/public/images/pokemon/variant/exp/937_2.png b/public/images/pokemon/variant/exp/937_2.png index af4a9c79eee..43e2b060319 100644 Binary files a/public/images/pokemon/variant/exp/937_2.png and b/public/images/pokemon/variant/exp/937_2.png differ diff --git a/public/images/pokemon/variant/exp/937_3.png b/public/images/pokemon/variant/exp/937_3.png index 5917cc01076..9a208ba1457 100644 Binary files a/public/images/pokemon/variant/exp/937_3.png and b/public/images/pokemon/variant/exp/937_3.png differ diff --git a/public/images/pokemon/variant/exp/94-mega_1.png b/public/images/pokemon/variant/exp/94-mega_1.png index f37635c0c8b..78787902b23 100644 Binary files a/public/images/pokemon/variant/exp/94-mega_1.png and b/public/images/pokemon/variant/exp/94-mega_1.png differ diff --git a/public/images/pokemon/variant/exp/94-mega_2.png b/public/images/pokemon/variant/exp/94-mega_2.png index 264672eb70b..c4ac996ff52 100644 Binary files a/public/images/pokemon/variant/exp/94-mega_2.png and b/public/images/pokemon/variant/exp/94-mega_2.png differ diff --git a/public/images/pokemon/variant/exp/94-mega_3.png b/public/images/pokemon/variant/exp/94-mega_3.png index 89965a8a68f..f63c504e903 100644 Binary files a/public/images/pokemon/variant/exp/94-mega_3.png and b/public/images/pokemon/variant/exp/94-mega_3.png differ diff --git a/public/images/pokemon/variant/exp/970_2.png b/public/images/pokemon/variant/exp/970_2.png index 23b7304a188..e7a046c2d7f 100644 Binary files a/public/images/pokemon/variant/exp/970_2.png and b/public/images/pokemon/variant/exp/970_2.png differ diff --git a/public/images/pokemon/variant/exp/970_3.png b/public/images/pokemon/variant/exp/970_3.png index 4513e32e924..213268b4d44 100644 Binary files a/public/images/pokemon/variant/exp/970_3.png and b/public/images/pokemon/variant/exp/970_3.png differ diff --git a/public/images/pokemon/variant/exp/978-curly_2.png b/public/images/pokemon/variant/exp/978-curly_2.png index 7fde5dc7ff4..800d4b3ee48 100644 Binary files a/public/images/pokemon/variant/exp/978-curly_2.png and b/public/images/pokemon/variant/exp/978-curly_2.png differ diff --git a/public/images/pokemon/variant/exp/978-curly_3.png b/public/images/pokemon/variant/exp/978-curly_3.png index 61f28cd014c..0625741b052 100644 Binary files a/public/images/pokemon/variant/exp/978-curly_3.png and b/public/images/pokemon/variant/exp/978-curly_3.png differ diff --git a/public/images/pokemon/variant/exp/978-droopy_2.png b/public/images/pokemon/variant/exp/978-droopy_2.png index c1570d64cc4..3ece2e41e47 100644 Binary files a/public/images/pokemon/variant/exp/978-droopy_2.png and b/public/images/pokemon/variant/exp/978-droopy_2.png differ diff --git a/public/images/pokemon/variant/exp/978-droopy_3.png b/public/images/pokemon/variant/exp/978-droopy_3.png index d64226dfb45..f1134506f3b 100644 Binary files a/public/images/pokemon/variant/exp/978-droopy_3.png and b/public/images/pokemon/variant/exp/978-droopy_3.png differ diff --git a/public/images/pokemon/variant/exp/978-stretchy_2.png b/public/images/pokemon/variant/exp/978-stretchy_2.png index 38fb36d785f..62d37a3e66a 100644 Binary files a/public/images/pokemon/variant/exp/978-stretchy_2.png and b/public/images/pokemon/variant/exp/978-stretchy_2.png differ diff --git a/public/images/pokemon/variant/exp/978-stretchy_3.png b/public/images/pokemon/variant/exp/978-stretchy_3.png index 1a2ded1841e..608ec2697cc 100644 Binary files a/public/images/pokemon/variant/exp/978-stretchy_3.png and b/public/images/pokemon/variant/exp/978-stretchy_3.png differ diff --git a/public/images/pokemon/variant/exp/979_1.png b/public/images/pokemon/variant/exp/979_1.png index 9d07620bf16..89c3a37d4aa 100644 Binary files a/public/images/pokemon/variant/exp/979_1.png and b/public/images/pokemon/variant/exp/979_1.png differ diff --git a/public/images/pokemon/variant/exp/979_2.png b/public/images/pokemon/variant/exp/979_2.png index 07c6ece9b07..788de4b089d 100644 Binary files a/public/images/pokemon/variant/exp/979_2.png and b/public/images/pokemon/variant/exp/979_2.png differ diff --git a/public/images/pokemon/variant/exp/979_3.png b/public/images/pokemon/variant/exp/979_3.png index da84b866c39..b0e6826c6c1 100644 Binary files a/public/images/pokemon/variant/exp/979_3.png and b/public/images/pokemon/variant/exp/979_3.png differ diff --git a/public/images/pokemon/variant/exp/994_3.png b/public/images/pokemon/variant/exp/994_3.png index a9f3f7fddc2..abd17460bc7 100644 Binary files a/public/images/pokemon/variant/exp/994_3.png and b/public/images/pokemon/variant/exp/994_3.png differ diff --git a/public/images/pokemon/variant/exp/997_2.png b/public/images/pokemon/variant/exp/997_2.png index 42065f31cad..6c61c142d9a 100644 Binary files a/public/images/pokemon/variant/exp/997_2.png and b/public/images/pokemon/variant/exp/997_2.png differ diff --git a/public/images/pokemon/variant/exp/997_3.png b/public/images/pokemon/variant/exp/997_3.png index 27ccadb26f8..c25719e15c7 100644 Binary files a/public/images/pokemon/variant/exp/997_3.png and b/public/images/pokemon/variant/exp/997_3.png differ diff --git a/public/images/pokemon/variant/exp/998_2.png b/public/images/pokemon/variant/exp/998_2.png index e79ad7c367b..ec371e4d986 100644 Binary files a/public/images/pokemon/variant/exp/998_2.png and b/public/images/pokemon/variant/exp/998_2.png differ diff --git a/public/images/pokemon/variant/exp/998_3.png b/public/images/pokemon/variant/exp/998_3.png index 19d7cc76f86..92db876caad 100644 Binary files a/public/images/pokemon/variant/exp/998_3.png and b/public/images/pokemon/variant/exp/998_3.png differ diff --git a/public/images/pokemon/variant/exp/999_1.png b/public/images/pokemon/variant/exp/999_1.png index c5092e856ce..df33c59f607 100644 Binary files a/public/images/pokemon/variant/exp/999_1.png and b/public/images/pokemon/variant/exp/999_1.png differ diff --git a/public/images/pokemon/variant/exp/back/181-mega_3.png b/public/images/pokemon/variant/exp/back/181-mega_3.png index 81856e501e1..771ce25a0da 100644 Binary files a/public/images/pokemon/variant/exp/back/181-mega_3.png and b/public/images/pokemon/variant/exp/back/181-mega_3.png differ diff --git a/public/images/pokemon/variant/exp/back/212-mega_2.png b/public/images/pokemon/variant/exp/back/212-mega_2.png index d4337df3477..877ede02ad4 100644 Binary files a/public/images/pokemon/variant/exp/back/212-mega_2.png and b/public/images/pokemon/variant/exp/back/212-mega_2.png differ diff --git a/public/images/pokemon/variant/exp/back/212-mega_3.png b/public/images/pokemon/variant/exp/back/212-mega_3.png index 173fb44c257..68db47ab830 100644 Binary files a/public/images/pokemon/variant/exp/back/212-mega_3.png and b/public/images/pokemon/variant/exp/back/212-mega_3.png differ diff --git a/public/images/pokemon/variant/exp/back/248-mega_2.png b/public/images/pokemon/variant/exp/back/248-mega_2.png index 6dd5a1a7111..7971c22d8fe 100644 Binary files a/public/images/pokemon/variant/exp/back/248-mega_2.png and b/public/images/pokemon/variant/exp/back/248-mega_2.png differ diff --git a/public/images/pokemon/variant/exp/back/3-mega_2.png b/public/images/pokemon/variant/exp/back/3-mega_2.png index 12a633ba7fa..777f4d0bca5 100644 Binary files a/public/images/pokemon/variant/exp/back/3-mega_2.png and b/public/images/pokemon/variant/exp/back/3-mega_2.png differ diff --git a/public/images/pokemon/variant/exp/back/3-mega_3.png b/public/images/pokemon/variant/exp/back/3-mega_3.png index dbca39c55e6..4684c989e3d 100644 Binary files a/public/images/pokemon/variant/exp/back/3-mega_3.png and b/public/images/pokemon/variant/exp/back/3-mega_3.png differ diff --git a/public/images/pokemon/variant/exp/back/4080_1.png b/public/images/pokemon/variant/exp/back/4080_1.png index 580548f6d3a..2bed3a5b4c1 100644 Binary files a/public/images/pokemon/variant/exp/back/4080_1.png and b/public/images/pokemon/variant/exp/back/4080_1.png differ diff --git a/public/images/pokemon/variant/exp/back/4080_2.png b/public/images/pokemon/variant/exp/back/4080_2.png index 988ac3f7834..e0fa30094cf 100644 Binary files a/public/images/pokemon/variant/exp/back/4080_2.png and b/public/images/pokemon/variant/exp/back/4080_2.png differ diff --git a/public/images/pokemon/variant/exp/back/4080_3.png b/public/images/pokemon/variant/exp/back/4080_3.png index 0fb239266ec..ed11f7ab90c 100644 Binary files a/public/images/pokemon/variant/exp/back/4080_3.png and b/public/images/pokemon/variant/exp/back/4080_3.png differ diff --git a/public/images/pokemon/variant/exp/back/4199_1.png b/public/images/pokemon/variant/exp/back/4199_1.png index 17e691cb35b..eb658cc2171 100644 Binary files a/public/images/pokemon/variant/exp/back/4199_1.png and b/public/images/pokemon/variant/exp/back/4199_1.png differ diff --git a/public/images/pokemon/variant/exp/back/665_2.png b/public/images/pokemon/variant/exp/back/665_2.png index bfddd085cc2..83762b9392c 100644 Binary files a/public/images/pokemon/variant/exp/back/665_2.png and b/public/images/pokemon/variant/exp/back/665_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-archipelago_2.png b/public/images/pokemon/variant/exp/back/666-archipelago_2.png index 032fd73f5c3..86e17e33f11 100644 Binary files a/public/images/pokemon/variant/exp/back/666-archipelago_2.png and b/public/images/pokemon/variant/exp/back/666-archipelago_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-archipelago_3.png b/public/images/pokemon/variant/exp/back/666-archipelago_3.png index b14fc9699cb..7028f550d45 100644 Binary files a/public/images/pokemon/variant/exp/back/666-archipelago_3.png and b/public/images/pokemon/variant/exp/back/666-archipelago_3.png differ diff --git a/public/images/pokemon/variant/exp/back/666-continental_2.png b/public/images/pokemon/variant/exp/back/666-continental_2.png index df588f7c4f5..3b9a31469af 100644 Binary files a/public/images/pokemon/variant/exp/back/666-continental_2.png and b/public/images/pokemon/variant/exp/back/666-continental_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-continental_3.png b/public/images/pokemon/variant/exp/back/666-continental_3.png index 76bb3953e51..b61b16538eb 100644 Binary files a/public/images/pokemon/variant/exp/back/666-continental_3.png and b/public/images/pokemon/variant/exp/back/666-continental_3.png differ diff --git a/public/images/pokemon/variant/exp/back/666-elegant_2.png b/public/images/pokemon/variant/exp/back/666-elegant_2.png index 68129e87db0..315b2fe859d 100644 Binary files a/public/images/pokemon/variant/exp/back/666-elegant_2.png and b/public/images/pokemon/variant/exp/back/666-elegant_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-elegant_3.png b/public/images/pokemon/variant/exp/back/666-elegant_3.png index d68e8977850..490bbb5951c 100644 Binary files a/public/images/pokemon/variant/exp/back/666-elegant_3.png and b/public/images/pokemon/variant/exp/back/666-elegant_3.png differ diff --git a/public/images/pokemon/variant/exp/back/666-fancy_2.png b/public/images/pokemon/variant/exp/back/666-fancy_2.png index 1fce2d851f4..a92f1e7eecf 100644 Binary files a/public/images/pokemon/variant/exp/back/666-fancy_2.png and b/public/images/pokemon/variant/exp/back/666-fancy_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-fancy_3.png b/public/images/pokemon/variant/exp/back/666-fancy_3.png index 8bb80556451..7a54e9bb6cd 100644 Binary files a/public/images/pokemon/variant/exp/back/666-fancy_3.png and b/public/images/pokemon/variant/exp/back/666-fancy_3.png differ diff --git a/public/images/pokemon/variant/exp/back/666-garden_2.png b/public/images/pokemon/variant/exp/back/666-garden_2.png index 547bcb72245..c56ff652c7d 100644 Binary files a/public/images/pokemon/variant/exp/back/666-garden_2.png and b/public/images/pokemon/variant/exp/back/666-garden_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-garden_3.png b/public/images/pokemon/variant/exp/back/666-garden_3.png index 8b0261631c3..60c7f5b7d01 100644 Binary files a/public/images/pokemon/variant/exp/back/666-garden_3.png and b/public/images/pokemon/variant/exp/back/666-garden_3.png differ diff --git a/public/images/pokemon/variant/exp/back/666-high-plains_2.png b/public/images/pokemon/variant/exp/back/666-high-plains_2.png index d656a17d3cd..d53634ed092 100644 Binary files a/public/images/pokemon/variant/exp/back/666-high-plains_2.png and b/public/images/pokemon/variant/exp/back/666-high-plains_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-high-plains_3.png b/public/images/pokemon/variant/exp/back/666-high-plains_3.png index cc4d6aa7536..d6c577be131 100644 Binary files a/public/images/pokemon/variant/exp/back/666-high-plains_3.png and b/public/images/pokemon/variant/exp/back/666-high-plains_3.png differ diff --git a/public/images/pokemon/variant/exp/back/666-icy-snow_2.png b/public/images/pokemon/variant/exp/back/666-icy-snow_2.png index f5b9bff1f1a..02e7e2e61af 100644 Binary files a/public/images/pokemon/variant/exp/back/666-icy-snow_2.png and b/public/images/pokemon/variant/exp/back/666-icy-snow_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-icy-snow_3.png b/public/images/pokemon/variant/exp/back/666-icy-snow_3.png index 3b9a184ff14..3c247e0d43a 100644 Binary files a/public/images/pokemon/variant/exp/back/666-icy-snow_3.png and b/public/images/pokemon/variant/exp/back/666-icy-snow_3.png differ diff --git a/public/images/pokemon/variant/exp/back/666-jungle_2.png b/public/images/pokemon/variant/exp/back/666-jungle_2.png index 64465ae4644..d6023a6500f 100644 Binary files a/public/images/pokemon/variant/exp/back/666-jungle_2.png and b/public/images/pokemon/variant/exp/back/666-jungle_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-jungle_3.png b/public/images/pokemon/variant/exp/back/666-jungle_3.png index e0132ad8b7a..0f4ca358601 100644 Binary files a/public/images/pokemon/variant/exp/back/666-jungle_3.png and b/public/images/pokemon/variant/exp/back/666-jungle_3.png differ diff --git a/public/images/pokemon/variant/exp/back/666-marine_2.png b/public/images/pokemon/variant/exp/back/666-marine_2.png index 11f4045e000..ffa21823012 100644 Binary files a/public/images/pokemon/variant/exp/back/666-marine_2.png and b/public/images/pokemon/variant/exp/back/666-marine_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-marine_3.png b/public/images/pokemon/variant/exp/back/666-marine_3.png index f8dbcebb2d2..ee4c51543ee 100644 Binary files a/public/images/pokemon/variant/exp/back/666-marine_3.png and b/public/images/pokemon/variant/exp/back/666-marine_3.png differ diff --git a/public/images/pokemon/variant/exp/back/666-meadow_2.png b/public/images/pokemon/variant/exp/back/666-meadow_2.png index 3a66918a8d2..bb54cac34cd 100644 Binary files a/public/images/pokemon/variant/exp/back/666-meadow_2.png and b/public/images/pokemon/variant/exp/back/666-meadow_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-meadow_3.png b/public/images/pokemon/variant/exp/back/666-meadow_3.png index 04c790e6b2b..865e404c1cd 100644 Binary files a/public/images/pokemon/variant/exp/back/666-meadow_3.png and b/public/images/pokemon/variant/exp/back/666-meadow_3.png differ diff --git a/public/images/pokemon/variant/exp/back/666-modern_2.png b/public/images/pokemon/variant/exp/back/666-modern_2.png index 1e226e6b79c..4cd5d770881 100644 Binary files a/public/images/pokemon/variant/exp/back/666-modern_2.png and b/public/images/pokemon/variant/exp/back/666-modern_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-modern_3.png b/public/images/pokemon/variant/exp/back/666-modern_3.png index 6d7516c4620..5795174404f 100644 Binary files a/public/images/pokemon/variant/exp/back/666-modern_3.png and b/public/images/pokemon/variant/exp/back/666-modern_3.png differ diff --git a/public/images/pokemon/variant/exp/back/666-monsoon_2.png b/public/images/pokemon/variant/exp/back/666-monsoon_2.png index 7570e6a7bfe..8f091f4d1de 100644 Binary files a/public/images/pokemon/variant/exp/back/666-monsoon_2.png and b/public/images/pokemon/variant/exp/back/666-monsoon_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-monsoon_3.png b/public/images/pokemon/variant/exp/back/666-monsoon_3.png index 6e9314cde1f..f216010ca99 100644 Binary files a/public/images/pokemon/variant/exp/back/666-monsoon_3.png and b/public/images/pokemon/variant/exp/back/666-monsoon_3.png differ diff --git a/public/images/pokemon/variant/exp/back/666-ocean_2.png b/public/images/pokemon/variant/exp/back/666-ocean_2.png index f8757bc7547..6f4fefc99f8 100644 Binary files a/public/images/pokemon/variant/exp/back/666-ocean_2.png and b/public/images/pokemon/variant/exp/back/666-ocean_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-ocean_3.png b/public/images/pokemon/variant/exp/back/666-ocean_3.png index 77b839e4326..554fcb7b510 100644 Binary files a/public/images/pokemon/variant/exp/back/666-ocean_3.png and b/public/images/pokemon/variant/exp/back/666-ocean_3.png differ diff --git a/public/images/pokemon/variant/exp/back/666-poke-ball_2.png b/public/images/pokemon/variant/exp/back/666-poke-ball_2.png index caaf61118bc..a1bd953a1b3 100644 Binary files a/public/images/pokemon/variant/exp/back/666-poke-ball_2.png and b/public/images/pokemon/variant/exp/back/666-poke-ball_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-poke-ball_3.png b/public/images/pokemon/variant/exp/back/666-poke-ball_3.png index 944f53eb4aa..9e7ff12912d 100644 Binary files a/public/images/pokemon/variant/exp/back/666-poke-ball_3.png and b/public/images/pokemon/variant/exp/back/666-poke-ball_3.png differ diff --git a/public/images/pokemon/variant/exp/back/666-polar_2.png b/public/images/pokemon/variant/exp/back/666-polar_2.png index e8d5a056bb3..b66daac7d2c 100644 Binary files a/public/images/pokemon/variant/exp/back/666-polar_2.png and b/public/images/pokemon/variant/exp/back/666-polar_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-polar_3.png b/public/images/pokemon/variant/exp/back/666-polar_3.png index 131d702ddb1..cab4822a306 100644 Binary files a/public/images/pokemon/variant/exp/back/666-polar_3.png and b/public/images/pokemon/variant/exp/back/666-polar_3.png differ diff --git a/public/images/pokemon/variant/exp/back/666-river_2.png b/public/images/pokemon/variant/exp/back/666-river_2.png index 97ce9b85139..c689a6c7150 100644 Binary files a/public/images/pokemon/variant/exp/back/666-river_2.png and b/public/images/pokemon/variant/exp/back/666-river_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-river_3.png b/public/images/pokemon/variant/exp/back/666-river_3.png index c84413aaaaf..a163e179d0e 100644 Binary files a/public/images/pokemon/variant/exp/back/666-river_3.png and b/public/images/pokemon/variant/exp/back/666-river_3.png differ diff --git a/public/images/pokemon/variant/exp/back/666-sandstorm_2.png b/public/images/pokemon/variant/exp/back/666-sandstorm_2.png index 541d183dc62..534e96bee13 100644 Binary files a/public/images/pokemon/variant/exp/back/666-sandstorm_2.png and b/public/images/pokemon/variant/exp/back/666-sandstorm_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-sandstorm_3.png b/public/images/pokemon/variant/exp/back/666-sandstorm_3.png index 393e47eb747..649fa83e025 100644 Binary files a/public/images/pokemon/variant/exp/back/666-sandstorm_3.png and b/public/images/pokemon/variant/exp/back/666-sandstorm_3.png differ diff --git a/public/images/pokemon/variant/exp/back/666-savanna_2.png b/public/images/pokemon/variant/exp/back/666-savanna_2.png index dea05ede882..b4b8ecedb9e 100644 Binary files a/public/images/pokemon/variant/exp/back/666-savanna_2.png and b/public/images/pokemon/variant/exp/back/666-savanna_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-savanna_3.png b/public/images/pokemon/variant/exp/back/666-savanna_3.png index bc2366e3483..6bc0a0b8363 100644 Binary files a/public/images/pokemon/variant/exp/back/666-savanna_3.png and b/public/images/pokemon/variant/exp/back/666-savanna_3.png differ diff --git a/public/images/pokemon/variant/exp/back/666-sun_2.png b/public/images/pokemon/variant/exp/back/666-sun_2.png index 32737f852e6..c9168d5a1c5 100644 Binary files a/public/images/pokemon/variant/exp/back/666-sun_2.png and b/public/images/pokemon/variant/exp/back/666-sun_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-sun_3.png b/public/images/pokemon/variant/exp/back/666-sun_3.png index d1679b936e1..1a36299851e 100644 Binary files a/public/images/pokemon/variant/exp/back/666-sun_3.png and b/public/images/pokemon/variant/exp/back/666-sun_3.png differ diff --git a/public/images/pokemon/variant/exp/back/666-tundra_2.png b/public/images/pokemon/variant/exp/back/666-tundra_2.png index 7311852570a..49325397d8a 100644 Binary files a/public/images/pokemon/variant/exp/back/666-tundra_2.png and b/public/images/pokemon/variant/exp/back/666-tundra_2.png differ diff --git a/public/images/pokemon/variant/exp/back/666-tundra_3.png b/public/images/pokemon/variant/exp/back/666-tundra_3.png index 3d1d40ca2a2..3284e1e637b 100644 Binary files a/public/images/pokemon/variant/exp/back/666-tundra_3.png and b/public/images/pokemon/variant/exp/back/666-tundra_3.png differ diff --git a/public/images/pokemon/variant/exp/back/696_1.png b/public/images/pokemon/variant/exp/back/696_1.png index daae82216a5..5e68ab9c167 100644 Binary files a/public/images/pokemon/variant/exp/back/696_1.png and b/public/images/pokemon/variant/exp/back/696_1.png differ diff --git a/public/images/pokemon/variant/exp/back/696_2.png b/public/images/pokemon/variant/exp/back/696_2.png index a8183d3c396..17e53dcd881 100644 Binary files a/public/images/pokemon/variant/exp/back/696_2.png and b/public/images/pokemon/variant/exp/back/696_2.png differ diff --git a/public/images/pokemon/variant/exp/back/696_3.png b/public/images/pokemon/variant/exp/back/696_3.png index 1eef16f0612..b6cecfa1c8d 100644 Binary files a/public/images/pokemon/variant/exp/back/696_3.png and b/public/images/pokemon/variant/exp/back/696_3.png differ diff --git a/public/images/pokemon/variant/exp/back/697_3.png b/public/images/pokemon/variant/exp/back/697_3.png index d9f80e85a02..4c916ab0d82 100644 Binary files a/public/images/pokemon/variant/exp/back/697_3.png and b/public/images/pokemon/variant/exp/back/697_3.png differ diff --git a/public/images/pokemon/variant/exp/back/699_2.png b/public/images/pokemon/variant/exp/back/699_2.png index 249930be50f..ea3da153124 100644 Binary files a/public/images/pokemon/variant/exp/back/699_2.png and b/public/images/pokemon/variant/exp/back/699_2.png differ diff --git a/public/images/pokemon/variant/exp/back/699_3.png b/public/images/pokemon/variant/exp/back/699_3.png index f5082d58284..4fd35302b43 100644 Binary files a/public/images/pokemon/variant/exp/back/699_3.png and b/public/images/pokemon/variant/exp/back/699_3.png differ diff --git a/public/images/pokemon/variant/exp/back/729_2.png b/public/images/pokemon/variant/exp/back/729_2.png index 1f2e8f31e2a..d5600f3bee4 100644 Binary files a/public/images/pokemon/variant/exp/back/729_2.png and b/public/images/pokemon/variant/exp/back/729_2.png differ diff --git a/public/images/pokemon/variant/exp/back/729_3.png b/public/images/pokemon/variant/exp/back/729_3.png index 08eb10257e1..182d81a0754 100644 Binary files a/public/images/pokemon/variant/exp/back/729_3.png and b/public/images/pokemon/variant/exp/back/729_3.png differ diff --git a/public/images/pokemon/variant/exp/back/730_2.png b/public/images/pokemon/variant/exp/back/730_2.png index b8340e4fca3..e9090ce19dd 100644 Binary files a/public/images/pokemon/variant/exp/back/730_2.png and b/public/images/pokemon/variant/exp/back/730_2.png differ diff --git a/public/images/pokemon/variant/exp/back/742_2.png b/public/images/pokemon/variant/exp/back/742_2.png index a442d157a0a..805fe7a4431 100644 Binary files a/public/images/pokemon/variant/exp/back/742_2.png and b/public/images/pokemon/variant/exp/back/742_2.png differ diff --git a/public/images/pokemon/variant/exp/back/742_3.png b/public/images/pokemon/variant/exp/back/742_3.png index 4fb526feb83..ddb72c1836a 100644 Binary files a/public/images/pokemon/variant/exp/back/742_3.png and b/public/images/pokemon/variant/exp/back/742_3.png differ diff --git a/public/images/pokemon/variant/exp/back/743_2.png b/public/images/pokemon/variant/exp/back/743_2.png index 33ab2c28ab8..e8b6ac6c82b 100644 Binary files a/public/images/pokemon/variant/exp/back/743_2.png and b/public/images/pokemon/variant/exp/back/743_2.png differ diff --git a/public/images/pokemon/variant/exp/back/743_3.png b/public/images/pokemon/variant/exp/back/743_3.png index 50328efe675..4a55750114d 100644 Binary files a/public/images/pokemon/variant/exp/back/743_3.png and b/public/images/pokemon/variant/exp/back/743_3.png differ diff --git a/public/images/pokemon/variant/exp/back/747_2.png b/public/images/pokemon/variant/exp/back/747_2.png index 50f44c0def7..f0df54539eb 100644 Binary files a/public/images/pokemon/variant/exp/back/747_2.png and b/public/images/pokemon/variant/exp/back/747_2.png differ diff --git a/public/images/pokemon/variant/exp/back/747_3.png b/public/images/pokemon/variant/exp/back/747_3.png index 2fb8e6036b9..7d887899e74 100644 Binary files a/public/images/pokemon/variant/exp/back/747_3.png and b/public/images/pokemon/variant/exp/back/747_3.png differ diff --git a/public/images/pokemon/variant/exp/back/754_2.png b/public/images/pokemon/variant/exp/back/754_2.png index 63f7486da1c..057d90eb009 100644 Binary files a/public/images/pokemon/variant/exp/back/754_2.png and b/public/images/pokemon/variant/exp/back/754_2.png differ diff --git a/public/images/pokemon/variant/exp/back/754_3.png b/public/images/pokemon/variant/exp/back/754_3.png index 205c3648755..3a3c01f7095 100644 Binary files a/public/images/pokemon/variant/exp/back/754_3.png and b/public/images/pokemon/variant/exp/back/754_3.png differ diff --git a/public/images/pokemon/variant/exp/back/776_2.png b/public/images/pokemon/variant/exp/back/776_2.png index 61e3662b56b..84393b04c56 100644 Binary files a/public/images/pokemon/variant/exp/back/776_2.png and b/public/images/pokemon/variant/exp/back/776_2.png differ diff --git a/public/images/pokemon/variant/exp/back/776_3.png b/public/images/pokemon/variant/exp/back/776_3.png index 5094ab508d1..600b00f8636 100644 Binary files a/public/images/pokemon/variant/exp/back/776_3.png and b/public/images/pokemon/variant/exp/back/776_3.png differ diff --git a/public/images/pokemon/variant/exp/back/857_2.png b/public/images/pokemon/variant/exp/back/857_2.png index d6472911e31..b51428bbec2 100644 Binary files a/public/images/pokemon/variant/exp/back/857_2.png and b/public/images/pokemon/variant/exp/back/857_2.png differ diff --git a/public/images/pokemon/variant/exp/back/857_3.png b/public/images/pokemon/variant/exp/back/857_3.png index 27f39ebfaf9..4dc21c5492d 100644 Binary files a/public/images/pokemon/variant/exp/back/857_3.png and b/public/images/pokemon/variant/exp/back/857_3.png differ diff --git a/public/images/pokemon/variant/exp/back/862_2.png b/public/images/pokemon/variant/exp/back/862_2.png index fae2900c566..55fee69723b 100644 Binary files a/public/images/pokemon/variant/exp/back/862_2.png and b/public/images/pokemon/variant/exp/back/862_2.png differ diff --git a/public/images/pokemon/variant/exp/back/862_3.png b/public/images/pokemon/variant/exp/back/862_3.png index 3f4537474f5..b3c9cc656b5 100644 Binary files a/public/images/pokemon/variant/exp/back/862_3.png and b/public/images/pokemon/variant/exp/back/862_3.png differ diff --git a/public/images/pokemon/variant/exp/back/9-mega_2.png b/public/images/pokemon/variant/exp/back/9-mega_2.png index e961ace2e5c..02987564bea 100644 Binary files a/public/images/pokemon/variant/exp/back/9-mega_2.png and b/public/images/pokemon/variant/exp/back/9-mega_2.png differ diff --git a/public/images/pokemon/variant/exp/back/9-mega_3.png b/public/images/pokemon/variant/exp/back/9-mega_3.png index 95a7babe58b..00150d4dd46 100644 Binary files a/public/images/pokemon/variant/exp/back/9-mega_3.png and b/public/images/pokemon/variant/exp/back/9-mega_3.png differ diff --git a/public/images/pokemon/variant/exp/back/910_2.png b/public/images/pokemon/variant/exp/back/910_2.png index 851bfd64563..2fa214c4e35 100644 Binary files a/public/images/pokemon/variant/exp/back/910_2.png and b/public/images/pokemon/variant/exp/back/910_2.png differ diff --git a/public/images/pokemon/variant/exp/back/910_3.png b/public/images/pokemon/variant/exp/back/910_3.png index 168db41336e..1027adef03f 100644 Binary files a/public/images/pokemon/variant/exp/back/910_3.png and b/public/images/pokemon/variant/exp/back/910_3.png differ diff --git a/public/images/pokemon/variant/exp/back/914_2.png b/public/images/pokemon/variant/exp/back/914_2.png index 5dee5c12f76..12bdc769c53 100644 Binary files a/public/images/pokemon/variant/exp/back/914_2.png and b/public/images/pokemon/variant/exp/back/914_2.png differ diff --git a/public/images/pokemon/variant/exp/back/914_3.png b/public/images/pokemon/variant/exp/back/914_3.png index 0185c529f70..5304b52d91a 100644 Binary files a/public/images/pokemon/variant/exp/back/914_3.png and b/public/images/pokemon/variant/exp/back/914_3.png differ diff --git a/public/images/pokemon/variant/exp/back/925-four_2.png b/public/images/pokemon/variant/exp/back/925-four_2.png index 6016d30d27c..9dd508f1cdb 100644 Binary files a/public/images/pokemon/variant/exp/back/925-four_2.png and b/public/images/pokemon/variant/exp/back/925-four_2.png differ diff --git a/public/images/pokemon/variant/exp/back/925-four_3.png b/public/images/pokemon/variant/exp/back/925-four_3.png index 3bc6a158fd5..74bb7d3385c 100644 Binary files a/public/images/pokemon/variant/exp/back/925-four_3.png and b/public/images/pokemon/variant/exp/back/925-four_3.png differ diff --git a/public/images/pokemon/variant/exp/back/925-three_2.png b/public/images/pokemon/variant/exp/back/925-three_2.png index 789e5afb20a..e2303d720b9 100644 Binary files a/public/images/pokemon/variant/exp/back/925-three_2.png and b/public/images/pokemon/variant/exp/back/925-three_2.png differ diff --git a/public/images/pokemon/variant/exp/back/925-three_3.png b/public/images/pokemon/variant/exp/back/925-three_3.png index cc1a1d3be11..8d568cce517 100644 Binary files a/public/images/pokemon/variant/exp/back/925-three_3.png and b/public/images/pokemon/variant/exp/back/925-three_3.png differ diff --git a/public/images/pokemon/variant/exp/back/936_1.png b/public/images/pokemon/variant/exp/back/936_1.png index 2b9e2d533f8..154c4e86364 100644 Binary files a/public/images/pokemon/variant/exp/back/936_1.png and b/public/images/pokemon/variant/exp/back/936_1.png differ diff --git a/public/images/pokemon/variant/exp/back/936_2.png b/public/images/pokemon/variant/exp/back/936_2.png index 45fb506fd01..442abc72971 100644 Binary files a/public/images/pokemon/variant/exp/back/936_2.png and b/public/images/pokemon/variant/exp/back/936_2.png differ diff --git a/public/images/pokemon/variant/exp/back/936_3.png b/public/images/pokemon/variant/exp/back/936_3.png index 82d3c0ecb0b..db67191d73e 100644 Binary files a/public/images/pokemon/variant/exp/back/936_3.png and b/public/images/pokemon/variant/exp/back/936_3.png differ diff --git a/public/images/pokemon/variant/exp/back/937_1.png b/public/images/pokemon/variant/exp/back/937_1.png index c0668be0103..2d0d58b0912 100644 Binary files a/public/images/pokemon/variant/exp/back/937_1.png and b/public/images/pokemon/variant/exp/back/937_1.png differ diff --git a/public/images/pokemon/variant/exp/back/937_2.png b/public/images/pokemon/variant/exp/back/937_2.png index f5bfd790b75..7ba1aa09b97 100644 Binary files a/public/images/pokemon/variant/exp/back/937_2.png and b/public/images/pokemon/variant/exp/back/937_2.png differ diff --git a/public/images/pokemon/variant/exp/back/937_3.png b/public/images/pokemon/variant/exp/back/937_3.png index c0a2be1ae0e..ee875356334 100644 Binary files a/public/images/pokemon/variant/exp/back/937_3.png and b/public/images/pokemon/variant/exp/back/937_3.png differ diff --git a/public/images/pokemon/variant/exp/back/952_2.png b/public/images/pokemon/variant/exp/back/952_2.png index 2518adc55ed..403030f2e3d 100644 Binary files a/public/images/pokemon/variant/exp/back/952_2.png and b/public/images/pokemon/variant/exp/back/952_2.png differ diff --git a/public/images/pokemon/variant/exp/back/968_2.png b/public/images/pokemon/variant/exp/back/968_2.png index 30b92268fbe..726c305140e 100644 Binary files a/public/images/pokemon/variant/exp/back/968_2.png and b/public/images/pokemon/variant/exp/back/968_2.png differ diff --git a/public/images/pokemon/variant/exp/back/968_3.png b/public/images/pokemon/variant/exp/back/968_3.png index e066f0eceef..541c3cf2d84 100644 Binary files a/public/images/pokemon/variant/exp/back/968_3.png and b/public/images/pokemon/variant/exp/back/968_3.png differ diff --git a/public/images/pokemon/variant/exp/back/970_2.png b/public/images/pokemon/variant/exp/back/970_2.png index dd61d57f2ac..5c7d2650363 100644 Binary files a/public/images/pokemon/variant/exp/back/970_2.png and b/public/images/pokemon/variant/exp/back/970_2.png differ diff --git a/public/images/pokemon/variant/exp/back/970_3.png b/public/images/pokemon/variant/exp/back/970_3.png index 025f88e1cbe..592c1f21961 100644 Binary files a/public/images/pokemon/variant/exp/back/970_3.png and b/public/images/pokemon/variant/exp/back/970_3.png differ diff --git a/public/images/pokemon/variant/exp/back/978-curly_2.png b/public/images/pokemon/variant/exp/back/978-curly_2.png index 205f55bf3dc..1ed3505ceee 100644 Binary files a/public/images/pokemon/variant/exp/back/978-curly_2.png and b/public/images/pokemon/variant/exp/back/978-curly_2.png differ diff --git a/public/images/pokemon/variant/exp/back/978-curly_3.png b/public/images/pokemon/variant/exp/back/978-curly_3.png index bee54677b74..dcc2129f72b 100644 Binary files a/public/images/pokemon/variant/exp/back/978-curly_3.png and b/public/images/pokemon/variant/exp/back/978-curly_3.png differ diff --git a/public/images/pokemon/variant/exp/back/978-droopy_2.png b/public/images/pokemon/variant/exp/back/978-droopy_2.png index ddd0430bca6..ed0999c43ca 100644 Binary files a/public/images/pokemon/variant/exp/back/978-droopy_2.png and b/public/images/pokemon/variant/exp/back/978-droopy_2.png differ diff --git a/public/images/pokemon/variant/exp/back/978-droopy_3.png b/public/images/pokemon/variant/exp/back/978-droopy_3.png index 6fa78fb9fef..22416861830 100644 Binary files a/public/images/pokemon/variant/exp/back/978-droopy_3.png and b/public/images/pokemon/variant/exp/back/978-droopy_3.png differ diff --git a/public/images/pokemon/variant/female/3_2.png b/public/images/pokemon/variant/female/3_2.png index df83d7b05e2..8e955e2c82f 100644 Binary files a/public/images/pokemon/variant/female/3_2.png and b/public/images/pokemon/variant/female/3_2.png differ diff --git a/public/images/pokemon/variant/female/402_2.png b/public/images/pokemon/variant/female/402_2.png index 3ce28cc787a..b9fd36890a3 100644 Binary files a/public/images/pokemon/variant/female/402_2.png and b/public/images/pokemon/variant/female/402_2.png differ diff --git a/public/images/pokemon/variant/female/402_3.png b/public/images/pokemon/variant/female/402_3.png index a34ef79b0ff..5e43029bfdb 100644 Binary files a/public/images/pokemon/variant/female/402_3.png and b/public/images/pokemon/variant/female/402_3.png differ diff --git a/public/images/pokemon/variant/female/419_2.png b/public/images/pokemon/variant/female/419_2.png index 897efbd57ba..ca9ea1d6f72 100644 Binary files a/public/images/pokemon/variant/female/419_2.png and b/public/images/pokemon/variant/female/419_2.png differ diff --git a/public/locales b/public/locales index ed1b1df4776..7ad20e64caa 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit ed1b1df4776ccd4330e8ac1d2f44de611d04c2bc +Subproject commit 7ad20e64caa9367b444712f10036fa9bbe4837a5 diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 2f062667808..c430a12ae3e 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -4,7 +4,7 @@ import Pokemon, { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; import PokemonSpecies, { allSpecies, getPokemonSpecies, PokemonSpeciesFilter } from "#app/data/pokemon-species"; import { Constructor, isNullOrUndefined, randSeedInt } from "#app/utils"; import * as Utils from "#app/utils"; -import { ConsumableModifier, ConsumablePokemonModifier, DoubleBattleChanceBoosterModifier, ExpBalanceModifier, ExpShareModifier, FusePokemonModifier, HealingBoosterModifier, Modifier, ModifierBar, ModifierPredicate, MultipleParticipantExpBonusModifier, overrideHeldItems, overrideModifiers, PersistentModifier, PokemonExpBoosterModifier, PokemonFormChangeItemModifier, PokemonHeldItemModifier, PokemonHpRestoreModifier, PokemonIncrementingStatModifier, RememberMoveModifier, TerastallizeModifier, TurnHeldItemTransferModifier } from "./modifier/modifier"; +import { ConsumableModifier, ConsumablePokemonModifier, DoubleBattleChanceBoosterModifier, ExpBalanceModifier, ExpShareModifier, FusePokemonModifier, HealingBoosterModifier, Modifier, ModifierBar, ModifierPredicate, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonFormChangeItemModifier, PokemonHeldItemModifier, PokemonHpRestoreModifier, PokemonIncrementingStatModifier, RememberMoveModifier, TerastallizeModifier, TurnHeldItemTransferModifier } from "./modifier/modifier"; import { PokeballType } from "#enums/pokeball"; import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from "#app/data/battle-anims"; import { Phase } from "#app/phase"; @@ -47,7 +47,7 @@ import PokemonInfoContainer from "#app/ui/pokemon-info-container"; import { biomeDepths, getBiomeName } from "#app/data/balance/biomes"; import { SceneBase } from "#app/scene-base"; import CandyBar from "#app/ui/candy-bar"; -import { Variant, variantData } from "#app/data/variant"; +import { Variant, variantColorCache, variantData, VariantSet } from "#app/data/variant"; import { Localizable } from "#app/interfaces/locales"; import Overrides from "#app/overrides"; import { InputsController } from "#app/inputs-controller"; @@ -345,6 +345,33 @@ export default class BattleScene extends SceneBase { this.load.atlas(key, `images/pokemon/${variant ? "variant/" : ""}${experimental ? "exp/" : ""}${atlasPath}.png`, `images/pokemon/${variant ? "variant/" : ""}${experimental ? "exp/" : ""}${atlasPath}.json`); } + /** + * Load the variant assets for the given sprite and stores them in {@linkcode variantColorCache} + */ + loadPokemonVariantAssets(spriteKey: string, fileRoot: string, variant?: Variant) { + const useExpSprite = this.experimentalSprites && this.hasExpSprite(spriteKey); + if (useExpSprite) { + fileRoot = `exp/${fileRoot}`; + } + let variantConfig = variantData; + fileRoot.split("/").map(p => variantConfig ? variantConfig = variantConfig[p] : null); + const variantSet = variantConfig as VariantSet; + if (variantSet && (variant !== undefined && variantSet[variant] === 1)) { + const populateVariantColors = (key: string): Promise => { + return new Promise(resolve => { + if (variantColorCache.hasOwnProperty(key)) { + return resolve(); + } + this.cachedFetch(`./images/pokemon/variant/${fileRoot}.json`).then(res => res.json()).then(c => { + variantColorCache[key] = c; + resolve(); + }); + }); + }; + populateVariantColors(spriteKey); + } + } + async preload() { if (DEBUG_RNG) { const scene = this; @@ -891,7 +918,7 @@ export default class BattleScene extends SceneBase { return pokemon; } - addEnemyPokemon(species: PokemonSpecies, level: integer, trainerSlot: TrainerSlot, boss: boolean = false, dataSource?: PokemonData, postProcess?: (enemyPokemon: EnemyPokemon) => void): EnemyPokemon { + addEnemyPokemon(species: PokemonSpecies, level: integer, trainerSlot: TrainerSlot, boss: boolean = false, shinyLock: boolean = false, dataSource?: PokemonData, postProcess?: (enemyPokemon: EnemyPokemon) => void): EnemyPokemon { if (Overrides.OPP_LEVEL_OVERRIDE > 0) { level = Overrides.OPP_LEVEL_OVERRIDE; } @@ -901,13 +928,11 @@ export default class BattleScene extends SceneBase { boss = this.getEncounterBossSegments(this.currentBattle.waveIndex, level, species) > 1; } - const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, dataSource); + const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, shinyLock, dataSource); if (Overrides.OPP_FUSION_OVERRIDE) { pokemon.generateFusionSpecies(); } - overrideModifiers(this, false); - overrideHeldItems(this, pokemon, false); if (boss && !dataSource) { const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967296)); @@ -2444,6 +2469,24 @@ export default class BattleScene extends SceneBase { } } + /** + * Tries to add the input phase to index after target phase in the {@linkcode phaseQueue}, else simply calls {@linkcode unshiftPhase()} + * @param phase {@linkcode Phase} the phase to be added + * @param targetPhase {@linkcode Phase} the type of phase to search for in {@linkcode phaseQueue} + * @returns `true` if a `targetPhase` was found to append to + */ + appendToPhase(phase: Phase, targetPhase: Constructor): boolean { + const targetIndex = this.phaseQueue.findIndex(ph => ph instanceof targetPhase); + + if (targetIndex !== -1 && this.phaseQueue.length > targetIndex) { + this.phaseQueue.splice(targetIndex + 1, 0, phase); + return true; + } else { + this.unshiftPhase(phase); + return false; + } + } + /** * Adds a MessagePhase, either to PhaseQueuePrepend or nextCommandPhaseQueue * @param message string for MessagePhase @@ -3008,7 +3051,8 @@ export default class BattleScene extends SceneBase { } validateAchv(achv: Achv, args?: unknown[]): boolean { - if (!this.gameData.achvUnlocks.hasOwnProperty(achv.id) && achv.validate(this, args)) { + if ((!this.gameData.achvUnlocks.hasOwnProperty(achv.id) || Overrides.ACHIEVEMENTS_REUNLOCK_OVERRIDE) + && achv.validate(this, args)) { this.gameData.achvUnlocks[achv.id] = new Date().getTime(); this.ui.achvBar.showAchv(achv); if (vouchers.hasOwnProperty(achv.id)) { diff --git a/src/data/ability.ts b/src/data/ability.ts index 1697c816902..7fa046e2369 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -3720,16 +3720,16 @@ export class PostTurnHurtIfSleepingAbAttr extends PostTurnAbAttr { /** * Deals damage to all sleeping opponents equal to 1/8 of their max hp (min 1) - * @param {Pokemon} pokemon Pokemon that has this ability - * @param {boolean} passive N/A - * @param {boolean} simulated true if applying in a simulated call. - * @param {any[]} args N/A - * @returns {boolean} true if any opponents are sleeping + * @param pokemon Pokemon that has this ability + * @param passive N/A + * @param simulated `true` if applying in a simulated call. + * @param args N/A + * @returns `true` if any opponents are sleeping */ applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { let hadEffect: boolean = false; for (const opp of pokemon.getOpponents()) { - if ((opp.status?.effect === StatusEffect.SLEEP || opp.hasAbility(Abilities.COMATOSE)) && !opp.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { + if ((opp.status?.effect === StatusEffect.SLEEP || opp.hasAbility(Abilities.COMATOSE)) && !opp.hasAbilityWithAttr(BlockNonDirectDamageAbAttr) && !opp.switchOutStatus) { if (!simulated) { opp.damageAndUpdate(Utils.toDmgValue(opp.getMaxHp() / 8), HitResult.OTHER); pokemon.scene.queueMessage(i18next.t("abilityTriggers:badDreams", { pokemonName: getPokemonNameWithAffix(opp) })); @@ -4112,9 +4112,13 @@ export class PostBattleAbAttr extends AbAttr { } export class PostBattleLootAbAttr extends PostBattleAbAttr { + /** + * @param args - `[0]`: boolean for if the battle ended in a victory + * @returns `true` if successful + */ applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { const postBattleLoot = pokemon.scene.currentBattle.postBattleLoot; - if (!simulated && postBattleLoot.length) { + if (!simulated && postBattleLoot.length && args[0]) { const randItem = Utils.randSeedItem(postBattleLoot); //@ts-ignore - TODO see below if (pokemon.scene.tryTransferHeldItemModifier(randItem, pokemon, true, 1, true, undefined, false)) { // TODO: fix. This is a promise!? @@ -4575,14 +4579,15 @@ export class MoneyAbAttr extends PostBattleAbAttr { /** * @param pokemon {@linkcode Pokemon} that is the user of this ability. * @param passive N/A - * @param args N/A - * @returns true + * @param args - `[0]`: boolean for if the battle ended in a victory + * @returns `true` if successful */ applyPostBattle(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { - if (!simulated) { + if (!simulated && args[0]) { pokemon.scene.currentBattle.moneyScattered += pokemon.scene.getWaveMoneyAmount(0.2); + return true; } - return true; + return false; } } @@ -4590,13 +4595,12 @@ export class MoneyAbAttr extends PostBattleAbAttr { * Applies a stat change after a Pokémon is summoned, * conditioned on the presence of a specific arena tag. * - * @extends {PostSummonStatStageChangeAbAttr} + * @extends PostSummonStatStageChangeAbAttr */ export class PostSummonStatStageChangeOnArenaAbAttr extends PostSummonStatStageChangeAbAttr { /** * The type of arena tag that conditions the stat change. * @private - * @type {ArenaTagType} */ private tagType: ArenaTagType; @@ -4972,7 +4976,7 @@ class ForceSwitchOutHelper { pokemon.scene.clearEnemyHeldItemModifiers(); if (switchOutTarget.hp) { - pokemon.scene.pushPhase(new BattleEndPhase(pokemon.scene)); + pokemon.scene.pushPhase(new BattleEndPhase(pokemon.scene, false)); pokemon.scene.pushPhase(new NewBattlePhase(pokemon.scene)); } } @@ -5709,9 +5713,7 @@ export function initAbilities() { .condition(getSheerForceHitDisableAbCondition()), new Ability(Abilities.SHEER_FORCE, 5) .attr(MovePowerBoostAbAttr, (user, target, move) => move.chance >= 1, 5461 / 4096) - .attr(MoveEffectChanceMultiplierAbAttr, 0) - .edgeCase() // Should disable shell bell and Meloetta's relic song transformation - .edgeCase(), // Should disable life orb, eject button, red card, kee/maranga berry if they get implemented + .attr(MoveEffectChanceMultiplierAbAttr, 0), // Should disable life orb, eject button, red card, kee/maranga berry if they get implemented new Ability(Abilities.CONTRARY, 5) .attr(StatStageChangeMultiplierAbAttr, -1) .ignorable(), @@ -5779,9 +5781,10 @@ export function initAbilities() { .attr(WonderSkinAbAttr) .ignorable(), new Ability(Abilities.ANALYTIC, 5) - .attr(MovePowerBoostAbAttr, (user, target, move) => - !!target?.getLastXMoves(1).find(m => m.turn === target?.scene.currentBattle.turn) - || user?.scene.currentBattle.turnCommands[target?.getBattlerIndex() ?? BattlerIndex.ATTACKER]?.command !== Command.FIGHT, 1.3), + .attr(MovePowerBoostAbAttr, (user, target, move) => { + const movePhase = user?.scene.findPhase((phase) => phase instanceof MovePhase && phase.pokemon.id !== user.id); + return Utils.isNullOrUndefined(movePhase); + }, 1.3), new Ability(Abilities.ILLUSION, 5) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) @@ -5929,10 +5932,10 @@ export function initAbilities() { .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, Stat.DEF, 1), new Ability(Abilities.WIMP_OUT, 7) .attr(PostDamageForceSwitchAbAttr) - .edgeCase(), // Should not trigger when hurting itself in confusion + .edgeCase(), // Should not trigger when hurting itself in confusion, causes Fake Out to fail turn 1 and succeed turn 2 if pokemon is switched out before battle start via playing in Switch Mode new Ability(Abilities.EMERGENCY_EXIT, 7) .attr(PostDamageForceSwitchAbAttr) - .edgeCase(), // Should not trigger when hurting itself in confusion + .edgeCase(), // Should not trigger when hurting itself in confusion, causes Fake Out to fail turn 1 and succeed turn 2 if pokemon is switched out before battle start via playing in Switch Mode new Ability(Abilities.WATER_COMPACTION, 7) .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => user.getMoveType(move) === Type.WATER && move.category !== MoveCategory.STATUS, Stat.DEF, 2), new Ability(Abilities.MERCILESS, 7) @@ -5948,7 +5951,7 @@ export function initAbilities() { .bypassFaint() .partial(), // Meteor form should protect against status effects and yawn new Ability(Abilities.STAKEOUT, 7) - .attr(MovePowerBoostAbAttr, (user, target, move) => user?.scene.currentBattle.turnCommands[target?.getBattlerIndex() ?? BattlerIndex.ATTACKER]?.command === Command.POKEMON, 2), + .attr(MovePowerBoostAbAttr, (user, target, move) => !!target?.turnData.switchedInThisTurn, 2), new Ability(Abilities.WATER_BUBBLE, 7) .attr(ReceivedTypeDamageMultiplierAbAttr, Type.FIRE, 0.5) .attr(MoveTypePowerBoostAbAttr, Type.WATER, 2) @@ -6091,11 +6094,9 @@ export function initAbilities() { new Ability(Abilities.NEUROFORCE, 7) .attr(MovePowerBoostAbAttr, (user, target, move) => (target?.getMoveEffectiveness(user!, move) ?? 1) >= 2, 1.25), new Ability(Abilities.INTREPID_SWORD, 8) - .attr(PostSummonStatStageChangeAbAttr, [ Stat.ATK ], 1, true) - .condition(getOncePerBattleCondition(Abilities.INTREPID_SWORD)), + .attr(PostSummonStatStageChangeAbAttr, [ Stat.ATK ], 1, true), new Ability(Abilities.DAUNTLESS_SHIELD, 8) - .attr(PostSummonStatStageChangeAbAttr, [ Stat.DEF ], 1, true) - .condition(getOncePerBattleCondition(Abilities.DAUNTLESS_SHIELD)), + .attr(PostSummonStatStageChangeAbAttr, [ Stat.DEF ], 1, true), new Ability(Abilities.LIBERO, 8) .attr(PokemonTypeChangeAbAttr), //.condition((p) => !p.summonData?.abilitiesApplied.includes(Abilities.LIBERO)), //Gen 9 Implementation @@ -6122,8 +6123,7 @@ export function initAbilities() { .attr(NoFusionAbilityAbAttr) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .bypassFaint() - .edgeCase(), // Soft-locks the game if a form-changed Cramorant and its attacker both faint at the same time (ex. using Self-Destruct) + .bypassFaint(), new Ability(Abilities.STALWART, 8) .attr(BlockRedirectAbAttr), new Ability(Abilities.STEAM_ENGINE, 8) @@ -6343,8 +6343,7 @@ export function initAbilities() { .attr(IgnoreOpponentStatStagesAbAttr, [ Stat.EVA ]) .ignorable(), new Ability(Abilities.SUPERSWEET_SYRUP, 9) - .attr(PostSummonStatStageChangeAbAttr, [ Stat.EVA ], -1) - .condition(getOncePerBattleCondition(Abilities.SUPERSWEET_SYRUP)), + .attr(PostSummonStatStageChangeAbAttr, [ Stat.EVA ], -1), new Ability(Abilities.HOSPITALITY, 9) .attr(PostSummonAllyHealAbAttr, 4, true), new Ability(Abilities.TOXIC_CHAIN, 9) diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 2f57650c65d..8bb74d29a4e 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -1144,7 +1144,7 @@ class FireGrassPledgeTag extends ArenaTag { ? arena.scene.getPlayerField() : arena.scene.getEnemyField(); - field.filter(pokemon => !pokemon.isOfType(Type.FIRE)).forEach(pokemon => { + field.filter(pokemon => !pokemon.isOfType(Type.FIRE) && !pokemon.switchOutStatus).forEach(pokemon => { // "{pokemonNameWithAffix} was hurt by the sea of fire!" pokemon.scene.queueMessage(i18next.t("arenaTag:fireGrassPledgeLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); // TODO: Replace this with a proper animation diff --git a/src/data/balance/egg-moves.ts b/src/data/balance/egg-moves.ts index 8df92e179d9..4855379f675 100644 --- a/src/data/balance/egg-moves.ts +++ b/src/data/balance/egg-moves.ts @@ -7,16 +7,16 @@ import { Species } from "#enums/species"; export const speciesEggMoves = { [Species.BULBASAUR]: [ Moves.SAPPY_SEED, Moves.MALIGNANT_CHAIN, Moves.EARTH_POWER, Moves.MATCHA_GOTCHA ], [Species.CHARMANDER]: [ Moves.DRAGON_DANCE, Moves.BITTER_BLADE, Moves.EARTH_POWER, Moves.OBLIVION_WING ], - [Species.SQUIRTLE]: [ Moves.FREEZE_DRY, Moves.SHORE_UP, Moves.BOUNCY_BUBBLE, Moves.ORIGIN_PULSE ], + [Species.SQUIRTLE]: [ Moves.FREEZE_DRY, Moves.ARMOR_CANNON, Moves.BOUNCY_BUBBLE, Moves.ORIGIN_PULSE ], [Species.CATERPIE]: [ Moves.SANDSEAR_STORM, Moves.SILK_TRAP, Moves.TWIN_BEAM, Moves.BLEAKWIND_STORM ], [Species.WEEDLE]: [ Moves.THOUSAND_ARROWS, Moves.NOXIOUS_TORQUE, Moves.ATTACK_ORDER, Moves.VICTORY_DANCE ], [Species.PIDGEY]: [ Moves.WILDBOLT_STORM, Moves.SANDSEAR_STORM, Moves.NASTY_PLOT, Moves.BOOMBURST ], [Species.RATTATA]: [ Moves.HYPER_FANG, Moves.PSYCHIC_FANGS, Moves.FIRE_FANG, Moves.EXTREME_SPEED ], - [Species.SPEAROW]: [ Moves.FLOATY_FALL, Moves.EXTREME_SPEED, Moves.TIDY_UP, Moves.TRIPLE_ARROWS ], + [Species.SPEAROW]: [ Moves.FLOATY_FALL, Moves.HYPER_DRILL, Moves.TIDY_UP, Moves.TRIPLE_ARROWS ], [Species.EKANS]: [ Moves.NOXIOUS_TORQUE, Moves.DRAGON_DANCE, Moves.SLACK_OFF, Moves.SHED_TAIL ], [Species.SANDSHREW]: [ Moves.HIGH_HORSEPOWER, Moves.DIRE_CLAW, Moves.SHORE_UP, Moves.MIGHTY_CLEAVE ], - [Species.NIDORAN_F]: [ Moves.NO_RETREAT, Moves.BANEFUL_BUNKER, Moves.SANDSEAR_STORM, Moves.MALIGNANT_CHAIN ], - [Species.NIDORAN_M]: [ Moves.NOXIOUS_TORQUE, Moves.KINGS_SHIELD, Moves.NO_RETREAT, Moves.PRECIPICE_BLADES ], + [Species.NIDORAN_F]: [ Moves.CALM_MIND, Moves.MOONLIGHT, Moves.MALIGNANT_CHAIN, Moves.SANDSEAR_STORM ], + [Species.NIDORAN_M]: [ Moves.DRAGON_DANCE, Moves.MOUNTAIN_GALE, Moves.NOXIOUS_TORQUE, Moves.PRECIPICE_BLADES ], [Species.VULPIX]: [ Moves.MOONBLAST, Moves.INFERNAL_PARADE, Moves.MORNING_SUN, Moves.TAIL_GLOW ], [Species.ZUBAT]: [ Moves.FLOATY_FALL, Moves.DIRE_CLAW, Moves.SWORDS_DANCE, Moves.COLLISION_COURSE ], [Species.ODDISH]: [ Moves.SLUDGE_BOMB, Moves.FIERY_DANCE, Moves.STRENGTH_SAP, Moves.SPORE ], @@ -31,105 +31,107 @@ export const speciesEggMoves = { [Species.ABRA]: [ Moves.AURA_SPHERE, Moves.BADDY_BAD, Moves.ICE_BEAM, Moves.PSYSTRIKE ], [Species.MACHOP]: [ Moves.COMBAT_TORQUE, Moves.METEOR_MASH, Moves.MOUNTAIN_GALE, Moves.FISSURE ], [Species.BELLSPROUT]: [ Moves.SOLAR_BLADE, Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.VICTORY_DANCE ], - [Species.TENTACOOL]: [ Moves.BANEFUL_BUNKER, Moves.STRENGTH_SAP, Moves.BOUNCY_BUBBLE, Moves.MALIGNANT_CHAIN ], + [Species.TENTACOOL]: [ Moves.BANEFUL_BUNKER, Moves.MALIGNANT_CHAIN, Moves.BOUNCY_BUBBLE, Moves.STRENGTH_SAP ], [Species.GEODUDE]: [ Moves.FLARE_BLITZ, Moves.HEAD_SMASH, Moves.SHORE_UP, Moves.SHELL_SMASH ], - [Species.PONYTA]: [ Moves.HIGH_HORSEPOWER, Moves.FIRE_LASH, Moves.SWORDS_DANCE, Moves.VOLT_TACKLE ], - [Species.SLOWPOKE]: [ Moves.BOUNCY_BUBBLE, Moves.FLAMETHROWER, Moves.MYSTICAL_POWER, Moves.SHED_TAIL ], + [Species.PONYTA]: [ Moves.HEADLONG_RUSH, Moves.FIRE_LASH, Moves.SWORDS_DANCE, Moves.VOLT_TACKLE ], + [Species.SLOWPOKE]: [ Moves.BOUNCY_BUBBLE, Moves.FROST_BREATH, Moves.SHED_TAIL, Moves.MYSTICAL_POWER ], [Species.MAGNEMITE]: [ Moves.PARABOLIC_CHARGE, Moves.FLAMETHROWER, Moves.ICE_BEAM, Moves.THUNDERCLAP ], [Species.FARFETCHD]: [ Moves.IVY_CUDGEL, Moves.TRIPLE_ARROWS, Moves.DRILL_RUN, Moves.VICTORY_DANCE ], - [Species.DODUO]: [ Moves.TRIPLE_AXEL, Moves.MULTI_ATTACK, Moves.FLOATY_FALL, Moves.TRIPLE_ARROWS ], + [Species.DODUO]: [ Moves.TRIPLE_AXEL, Moves.HYPER_DRILL, Moves.FLOATY_FALL, Moves.TRIPLE_ARROWS ], [Species.SEEL]: [ Moves.FREEZE_DRY, Moves.BOUNCY_BUBBLE, Moves.SLACK_OFF, Moves.STEAM_ERUPTION ], - [Species.GRIMER]: [ Moves.SUCKER_PUNCH, Moves.CURSE, Moves.STRENGTH_SAP, Moves.NOXIOUS_TORQUE ], + [Species.GRIMER]: [ Moves.SUCKER_PUNCH, Moves.CURSE, Moves.NOXIOUS_TORQUE, Moves.STRENGTH_SAP ], [Species.SHELLDER]: [ Moves.ROCK_BLAST, Moves.WATER_SHURIKEN, Moves.BANEFUL_BUNKER, Moves.BONE_RUSH ], - [Species.GASTLY]: [ Moves.SLUDGE_BOMB, Moves.AURA_SPHERE, Moves.NASTY_PLOT, Moves.ASTRAL_BARRAGE ], + [Species.GASTLY]: [ Moves.MALIGNANT_CHAIN, Moves.AURA_SPHERE, Moves.PARTING_SHOT, Moves.DARK_VOID ], [Species.ONIX]: [ Moves.SHORE_UP, Moves.THOUSAND_WAVES, Moves.COIL, Moves.DIAMOND_STORM ], [Species.DROWZEE]: [ Moves.BADDY_BAD, Moves.STRENGTH_SAP, Moves.LUMINA_CRASH, Moves.DARK_VOID ], - [Species.KRABBY]: [ Moves.DIRE_CLAW, Moves.JET_PUNCH, Moves.IVY_CUDGEL, Moves.SHELL_SMASH ], + [Species.KRABBY]: [ Moves.DIRE_CLAW, Moves.DRAGON_HAMMER, Moves.IVY_CUDGEL, Moves.JET_PUNCH ], [Species.VOLTORB]: [ Moves.NASTY_PLOT, Moves.FUSION_FLARE, Moves.FROST_BREATH, Moves.ELECTRO_DRIFT ], [Species.EXEGGCUTE]: [ Moves.FICKLE_BEAM, Moves.APPLE_ACID, Moves.TRICK_ROOM, Moves.LUMINA_CRASH ], [Species.CUBONE]: [ Moves.HEAD_SMASH, Moves.WOOD_HAMMER, Moves.SHADOW_SNEAK, Moves.BITTER_BLADE ], [Species.LICKITUNG]: [ Moves.CRUSH_GRIP, Moves.FIRE_LASH, Moves.SLACK_OFF, Moves.MAGICAL_TORQUE ], [Species.KOFFING]: [ Moves.SCALD, Moves.RECOVER, Moves.BODY_PRESS, Moves.MALIGNANT_CHAIN ], [Species.RHYHORN]: [ Moves.SHORE_UP, Moves.ICE_HAMMER, Moves.ACCELEROCK, Moves.HEAD_SMASH ], - [Species.TANGELA]: [ Moves.STRENGTH_SAP, Moves.SNAP_TRAP, Moves.PARTING_SHOT, Moves.SAPPY_SEED ], + [Species.TANGELA]: [ Moves.NATURES_MADNESS, Moves.SNAP_TRAP, Moves.PARTING_SHOT, Moves.SAPPY_SEED ], [Species.KANGASKHAN]: [ Moves.POWER_UP_PUNCH, Moves.TRAILBLAZE, Moves.FACADE, Moves.SEISMIC_TOSS ], - [Species.HORSEA]: [ Moves.SNIPE_SHOT, Moves.FROST_BREATH, Moves.HURRICANE, Moves.SPACIAL_REND ], + [Species.HORSEA]: [ Moves.SNIPE_SHOT, Moves.FROST_BREATH, Moves.SLUDGE_BOMB, Moves.CLANGING_SCALES ], [Species.GOLDEEN]: [ Moves.GLACIAL_LANCE, Moves.SUPERCELL_SLAM, Moves.DRAGON_DANCE, Moves.FISHIOUS_REND ], [Species.STARYU]: [ Moves.CALM_MIND, Moves.BOUNCY_BUBBLE, Moves.MOONBLAST, Moves.MYSTICAL_POWER ], - [Species.SCYTHER]: [ Moves.MIGHTY_CLEAVE, Moves.BUG_BITE, Moves.STORM_THROW, Moves.DOUBLE_IRON_BASH ], + [Species.SCYTHER]: [ Moves.MIGHTY_CLEAVE, Moves.GEAR_GRIND, Moves.STORM_THROW, Moves.BITTER_BLADE ], [Species.PINSIR]: [ Moves.HEADLONG_RUSH, Moves.LEECH_LIFE, Moves.CRUSH_GRIP, Moves.EXTREME_SPEED ], - [Species.TAUROS]: [ Moves.HIGH_HORSEPOWER, Moves.FIRE_LASH, Moves.LIQUIDATION, Moves.COMBAT_TORQUE ], + [Species.TAUROS]: [ Moves.SWORDS_DANCE, Moves.FIRE_LASH, Moves.WICKED_TORQUE, Moves.COLLISION_COURSE ], [Species.MAGIKARP]: [ Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.DRAGON_ASCENT, Moves.SURGING_STRIKES ], [Species.LAPRAS]: [ Moves.RECOVER, Moves.FREEZE_DRY, Moves.SCALD, Moves.SHELL_SMASH ], [Species.DITTO]: [ Moves.MIMIC, Moves.SKETCH, Moves.METRONOME, Moves.IMPRISON ], [Species.EEVEE]: [ Moves.WISH, Moves.NO_RETREAT, Moves.ZIPPY_ZAP, Moves.BOOMBURST ], [Species.PORYGON]: [ Moves.THUNDERCLAP, Moves.AURA_SPHERE, Moves.FLAMETHROWER, Moves.TECHNO_BLAST ], - [Species.OMANYTE]: [ Moves.FREEZE_DRY, Moves.EARTH_POWER, Moves.POWER_GEM, Moves.STEAM_ERUPTION ], - [Species.KABUTO]: [ Moves.CEASELESS_EDGE, Moves.HIGH_HORSEPOWER, Moves.TRIPLE_DIVE, Moves.MIGHTY_CLEAVE ], + [Species.OMANYTE]: [ Moves.FREEZE_DRY, Moves.GIGA_DRAIN, Moves.POWER_GEM, Moves.STEAM_ERUPTION ], + [Species.KABUTO]: [ Moves.CEASELESS_EDGE, Moves.HIGH_HORSEPOWER, Moves.CRABHAMMER, Moves.MIGHTY_CLEAVE ], [Species.AERODACTYL]: [ Moves.FLOATY_FALL, Moves.FLARE_BLITZ, Moves.SWORDS_DANCE, Moves.MIGHTY_CLEAVE ], [Species.ARTICUNO]: [ Moves.EARTH_POWER, Moves.CALM_MIND, Moves.AURORA_VEIL, Moves.AEROBLAST ], [Species.ZAPDOS]: [ Moves.BLEAKWIND_STORM, Moves.CALM_MIND, Moves.SANDSEAR_STORM, Moves.ELECTRO_SHOT ], - [Species.MOLTRES]: [ Moves.SCORCHING_SANDS, Moves.CALM_MIND, Moves.AEROBLAST, Moves.TORCH_SONG ], + [Species.MOLTRES]: [ Moves.EARTH_POWER, Moves.CALM_MIND, Moves.AEROBLAST, Moves.TORCH_SONG ], [Species.DRATINI]: [ Moves.DRAGON_HAMMER, Moves.CRUSH_GRIP, Moves.FIRE_LASH, Moves.GIGATON_HAMMER ], [Species.MEWTWO]: [ Moves.METEOR_MASH, Moves.MOONBLAST, Moves.THUNDEROUS_KICK, Moves.PHOTON_GEYSER ], [Species.MEW]: [ Moves.PHOTON_GEYSER, Moves.MOONBLAST, Moves.ASTRAL_BARRAGE, Moves.SHELL_SMASH ], + [Species.CHIKORITA]: [ Moves.SAPPY_SEED, Moves.STONE_AXE, Moves.DRAGON_DANCE, Moves.SPORE ], [Species.CYNDAQUIL]: [ Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.FIERY_DANCE, Moves.ELECTRO_DRIFT ], - [Species.TOTODILE]: [ Moves.THUNDER_PUNCH, Moves.DRAGON_DANCE, Moves.TRIPLE_AXEL, Moves.FISHIOUS_REND ], + [Species.TOTODILE]: [ Moves.THUNDER_PUNCH, Moves.DRAGON_DANCE, Moves.TRIPLE_AXEL, Moves.SURGING_STRIKES ], [Species.SENTRET]: [ Moves.TIDY_UP, Moves.FAKE_OUT, Moves.NUZZLE, Moves.EXTREME_SPEED ], [Species.HOOTHOOT]: [ Moves.CALM_MIND, Moves.ESPER_WING, Moves.AEROBLAST, Moves.BOOMBURST ], - [Species.LEDYBA]: [ Moves.POLLEN_PUFF, Moves.THIEF, Moves.PARTING_SHOT, Moves.SPORE ], + [Species.LEDYBA]: [ Moves.POLLEN_PUFF, Moves.MAT_BLOCK, Moves.PARTING_SHOT, Moves.SPORE ], [Species.SPINARAK]: [ Moves.PARTING_SHOT, Moves.ATTACK_ORDER, Moves.GASTRO_ACID, Moves.STRENGTH_SAP ], [Species.CHINCHOU]: [ Moves.THUNDERCLAP, Moves.BOUNCY_BUBBLE, Moves.THUNDER_CAGE, Moves.TAIL_GLOW ], [Species.PICHU]: [ Moves.MOONBLAST, Moves.TRIPLE_AXEL, Moves.FIERY_DANCE, Moves.AURA_WHEEL ], [Species.CLEFFA]: [ Moves.CALM_MIND, Moves.EARTH_POWER, Moves.WISH, Moves.LIGHT_OF_RUIN ], [Species.IGGLYBUFF]: [ Moves.DRAIN_PUNCH, Moves.GRAV_APPLE, Moves.SOFT_BOILED, Moves.EXTREME_SPEED ], - [Species.TOGEPI]: [ Moves.SCORCHING_SANDS, Moves.ROOST, Moves.RELIC_SONG, Moves.FIERY_DANCE ], - [Species.NATU]: [ Moves.AEROBLAST, Moves.ROOST, Moves.MOONBLAST, Moves.LUMINA_CRASH ], + [Species.TOGEPI]: [ Moves.SCORCHING_SANDS, Moves.SPLISHY_SPLASH, Moves.RELIC_SONG, Moves.FIERY_DANCE ], + [Species.NATU]: [ Moves.REVIVAL_BLESSING, Moves.NASTY_PLOT, Moves.MOONBLAST, Moves.OBLIVION_WING ], [Species.MAREEP]: [ Moves.ICE_BEAM, Moves.PARABOLIC_CHARGE, Moves.CORE_ENFORCER, Moves.TAIL_GLOW ], [Species.HOPPIP]: [ Moves.FLOATY_FALL, Moves.STRENGTH_SAP, Moves.SAPPY_SEED, Moves.SPORE ], - [Species.AIPOM]: [ Moves.TIDY_UP, Moves.STORM_THROW, Moves.FAKE_OUT, Moves.POPULATION_BOMB ], + [Species.AIPOM]: [ Moves.ROCK_BLAST, Moves.STORM_THROW, Moves.FAKE_OUT, Moves.SWORDS_DANCE ], [Species.SUNKERN]: [ Moves.SPORE, Moves.QUIVER_DANCE, Moves.FIERY_DANCE, Moves.HYDRO_STEAM ], [Species.YANMA]: [ Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.HEAT_WAVE, Moves.BLEAKWIND_STORM ], - [Species.WOOPER]: [ Moves.SIZZLY_SLIDE, Moves.RECOVER, Moves.CURSE, Moves.SURGING_STRIKES ], + [Species.WOOPER]: [ Moves.SIZZLY_SLIDE, Moves.RECOVER, Moves.SHED_TAIL, Moves.SURGING_STRIKES ], [Species.MURKROW]: [ Moves.TRIPLE_ARROWS, Moves.FLOATY_FALL, Moves.TIDY_UP, Moves.WICKED_BLOW ], - [Species.MISDREAVUS]: [ Moves.TAKE_HEART, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.ASTRAL_BARRAGE ], + [Species.MISDREAVUS]: [ Moves.TAKE_HEART, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.MOONGEIST_BEAM ], [Species.UNOWN]: [ Moves.NATURE_POWER, Moves.COSMIC_POWER, Moves.ANCIENT_POWER, Moves.MYSTICAL_POWER ], [Species.GIRAFARIG]: [ Moves.MYSTICAL_POWER, Moves.NIGHT_DAZE, Moves.RECOVER, Moves.BOOMBURST ], [Species.PINECO]: [ Moves.METAL_BURST, Moves.SHORE_UP, Moves.BODY_PRESS, Moves.DIAMOND_STORM ], [Species.DUNSPARCE]: [ Moves.WICKED_TORQUE, Moves.MAGICAL_TORQUE, Moves.BLAZING_TORQUE, Moves.EXTREME_SPEED ], - [Species.GLIGAR]: [ Moves.FLOATY_FALL, Moves.THOUSAND_WAVES, Moves.ROOST, Moves.MIGHTY_CLEAVE ], - [Species.SNUBBULL]: [ Moves.FACADE, Moves.EARTHQUAKE, Moves.SWORDS_DANCE, Moves.EXTREME_SPEED ], - [Species.QWILFISH]: [ Moves.BARB_BARRAGE, Moves.BANEFUL_BUNKER, Moves.KNOCK_OFF, Moves.FISHIOUS_REND ], + [Species.GLIGAR]: [ Moves.FLOATY_FALL, Moves.THOUSAND_WAVES, Moves.SPIKY_SHIELD, Moves.MIGHTY_CLEAVE ], + [Species.SNUBBULL]: [ Moves.FACADE, Moves.HIGH_HORSEPOWER, Moves.SWORDS_DANCE, Moves.EXTREME_SPEED ], + [Species.QWILFISH]: [ Moves.BARB_BARRAGE, Moves.BANEFUL_BUNKER, Moves.RECOVER, Moves.FISHIOUS_REND ], [Species.SHUCKLE]: [ Moves.STUFF_CHEEKS, Moves.HEAL_ORDER, Moves.BODY_PRESS, Moves.SALT_CURE ], - [Species.HERACROSS]: [ Moves.ROCK_BLAST, Moves.FIRST_IMPRESSION, Moves.ICICLE_SPEAR, Moves.DRAGON_DANCE ], - [Species.SNEASEL]: [ Moves.DIRE_CLAW, Moves.STORM_THROW, Moves.TRIPLE_AXEL, Moves.WICKED_BLOW ], + [Species.HERACROSS]: [ Moves.ROCK_BLAST, Moves.FIRST_IMPRESSION, Moves.ICICLE_SPEAR, Moves.TIDY_UP ], + [Species.SNEASEL]: [ Moves.DIRE_CLAW, Moves.DARKEST_LARIAT, Moves.TRIPLE_AXEL, Moves.CLOSE_COMBAT ], [Species.TEDDIURSA]: [ Moves.MOUNTAIN_GALE, Moves.FAKE_OUT, Moves.SLACK_OFF, Moves.PRECIPICE_BLADES ], [Species.SLUGMA]: [ Moves.BURNING_BULWARK, Moves.POWER_GEM, Moves.SOLAR_BEAM, Moves.MAGMA_STORM ], - [Species.SWINUB]: [ Moves.SLACK_OFF, Moves.LANDS_WRATH, Moves.MIGHTY_CLEAVE, Moves.GLACIAL_LANCE ], + [Species.SWINUB]: [ Moves.SLACK_OFF, Moves.MOUNTAIN_GALE, Moves.STONE_AXE, Moves.PRECIPICE_BLADES ], [Species.CORSOLA]: [ Moves.SCALD, Moves.FREEZE_DRY, Moves.STRENGTH_SAP, Moves.SALT_CURE ], [Species.REMORAID]: [ Moves.WATER_SHURIKEN, Moves.TAKE_HEART, Moves.SHELL_SIDE_ARM, Moves.BOUNCY_BUBBLE ], [Species.DELIBIRD]: [ Moves.BONEMERANG, Moves.FLOATY_FALL, Moves.VICTORY_DANCE, Moves.GLACIAL_LANCE ], [Species.SKARMORY]: [ Moves.ROOST, Moves.BODY_PRESS, Moves.SPIKY_SHIELD, Moves.BEAK_BLAST ], - [Species.HOUNDOUR]: [ Moves.MOONLIGHT, Moves.FIERY_WRATH, Moves.SECRET_SWORD, Moves.HYDRO_STEAM ], - [Species.PHANPY]: [ Moves.SHORE_UP, Moves.SWORDS_DANCE, Moves.ICICLE_CRASH, Moves.COLLISION_COURSE ], + [Species.HOUNDOUR]: [ Moves.EARTH_POWER, Moves.THUNDERBOLT, Moves.MOONBLAST, Moves.FIERY_WRATH ], + [Species.PHANPY]: [ Moves.SHORE_UP, Moves.SWORDS_DANCE, Moves.MOUNTAIN_GALE, Moves.COLLISION_COURSE ], [Species.STANTLER]: [ Moves.THUNDEROUS_KICK, Moves.PHOTON_GEYSER, Moves.SWORDS_DANCE, Moves.BOOMBURST ], [Species.SMEARGLE]: [ Moves.CONVERSION, Moves.BURNING_BULWARK, Moves.SALT_CURE, Moves.DARK_VOID ], [Species.TYROGUE]: [ Moves.VICTORY_DANCE, Moves.THUNDEROUS_KICK, Moves.METEOR_MASH, Moves.WICKED_BLOW ], - [Species.SMOOCHUM]: [ Moves.EXPANDING_FORCE, Moves.AURA_SPHERE, Moves.FREEZE_DRY, Moves.QUIVER_DANCE ], + [Species.SMOOCHUM]: [ Moves.LUSTER_PURGE, Moves.AURA_SPHERE, Moves.FREEZE_DRY, Moves.QUIVER_DANCE ], [Species.ELEKID]: [ Moves.FIRE_LASH, Moves.ZING_ZAP, Moves.MOUNTAIN_GALE, Moves.SHIFT_GEAR ], - [Species.MAGBY]: [ Moves.THUNDERCLAP, Moves.EARTH_POWER, Moves.ARMOR_CANNON, Moves.FLEUR_CANNON ], - [Species.MILTANK]: [ Moves.BODY_PRESS, Moves.BULK_UP, Moves.YAWN, Moves.SIZZLY_SLIDE ], + [Species.MAGBY]: [ Moves.THUNDERCLAP, Moves.EARTH_POWER, Moves.ENERGY_BALL, Moves.BLUE_FLARE ], + [Species.MILTANK]: [ Moves.BODY_PRESS, Moves.BULK_UP, Moves.KNOCK_OFF, Moves.SIZZLY_SLIDE ], [Species.RAIKOU]: [ Moves.PARABOLIC_CHARGE, Moves.NASTY_PLOT, Moves.FROST_BREATH, Moves.ELECTRO_DRIFT ], - [Species.ENTEI]: [ Moves.BURNING_BULWARK, Moves.DRAGON_DANCE, Moves.EARTHQUAKE, Moves.MIGHTY_CLEAVE ], + [Species.ENTEI]: [ Moves.BURNING_BULWARK, Moves.DRAGON_DANCE, Moves.EARTHQUAKE, Moves.PYRO_BALL ], [Species.SUICUNE]: [ Moves.RECOVER, Moves.NASTY_PLOT, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ], [Species.LARVITAR]: [ Moves.DRAGON_DANCE, Moves.MOUNTAIN_GALE, Moves.SHORE_UP, Moves.DIAMOND_STORM ], [Species.LUGIA]: [ Moves.NASTY_PLOT, Moves.LUMINA_CRASH, Moves.AURA_SPHERE, Moves.OBLIVION_WING ], [Species.HO_OH]: [ Moves.BRAVE_BIRD, Moves.DRAGON_DANCE, Moves.REVIVAL_BLESSING, Moves.BOLT_BEAK ], [Species.CELEBI]: [ Moves.PHOTON_GEYSER, Moves.MATCHA_GOTCHA, Moves.REVIVAL_BLESSING, Moves.QUIVER_DANCE ], - [Species.TREECKO]: [ Moves.NASTY_PLOT, Moves.APPLE_ACID, Moves.SECRET_SWORD, Moves.DRAGON_ENERGY ], - [Species.TORCHIC]: [ Moves.HIGH_JUMP_KICK, Moves.SUPERCELL_SLAM, Moves.BURNING_BULWARK, Moves.V_CREATE ], - [Species.MUDKIP]: [ Moves.SHORE_UP, Moves.MOUNTAIN_GALE, Moves.BULK_UP, Moves.SURGING_STRIKES ], + + [Species.TREECKO]: [ Moves.NASTY_PLOT, Moves.CORE_ENFORCER, Moves.FLAMETHROWER, Moves.SEED_FLARE ], + [Species.TORCHIC]: [ Moves.THUNDEROUS_KICK, Moves.ZING_ZAP, Moves.BURNING_BULWARK, Moves.PYRO_BALL ], + [Species.MUDKIP]: [ Moves.SHORE_UP, Moves.MOUNTAIN_GALE, Moves.AQUA_STEP, Moves.PRECIPICE_BLADES ], [Species.POOCHYENA]: [ Moves.JAW_LOCK, Moves.CLOSE_COMBAT, Moves.DIRE_CLAW, Moves.NO_RETREAT ], [Species.ZIGZAGOON]: [ Moves.EXTREME_SPEED, Moves.NUZZLE, Moves.HIGH_HORSEPOWER, Moves.TIDY_UP ], [Species.WURMPLE]: [ Moves.BATON_PASS, Moves.BLEAKWIND_STORM, Moves.STORED_POWER, Moves.MALIGNANT_CHAIN ], @@ -151,35 +153,35 @@ export const speciesEggMoves = { [Species.MAWILE]: [ Moves.BULLET_PUNCH, Moves.MAGICAL_TORQUE, Moves.EARTHQUAKE, Moves.SHIFT_GEAR ], [Species.ARON]: [ Moves.HEAD_SMASH, Moves.BODY_PRESS, Moves.SHORE_UP, Moves.SALT_CURE ], [Species.MEDITITE]: [ Moves.THUNDEROUS_KICK, Moves.SUCKER_PUNCH, Moves.BULLET_PUNCH, Moves.PHOTON_GEYSER ], - [Species.ELECTRIKE]: [ Moves.RISING_VOLTAGE, Moves.FLAMETHROWER, Moves.NASTY_PLOT, Moves.ICE_BEAM ], + [Species.ELECTRIKE]: [ Moves.FROST_BREATH, Moves.HEAT_WAVE, Moves.NASTY_PLOT, Moves.ELECTRO_DRIFT ], [Species.PLUSLE]: [ Moves.FLAMETHROWER, Moves.GLITZY_GLOW, Moves.SPLISHY_SPLASH, Moves.TAIL_GLOW ], [Species.MINUN]: [ Moves.ICE_BEAM, Moves.BADDY_BAD, Moves.SPARKLY_SWIRL, Moves.TAIL_GLOW ], [Species.VOLBEAT]: [ Moves.BATON_PASS, Moves.STICKY_WEB, Moves.DECORATE, Moves.VICTORY_DANCE ], [Species.ILLUMISE]: [ Moves.PARTING_SHOT, Moves.GLITZY_GLOW, Moves.POWDER, Moves.QUIVER_DANCE ], - [Species.GULPIN]: [ Moves.STRENGTH_SAP, Moves.EARTH_POWER, Moves.CALM_MIND, Moves.MALIGNANT_CHAIN ], + [Species.GULPIN]: [ Moves.MALIGNANT_CHAIN, Moves.EARTH_POWER, Moves.CALM_MIND, Moves.STRENGTH_SAP ], [Species.CARVANHA]: [ Moves.THUNDER_FANG, Moves.SWORDS_DANCE, Moves.OBSTRUCT, Moves.SURGING_STRIKES ], - [Species.WAILMER]: [ Moves.TAKE_HEART, Moves.BOUNCY_BUBBLE, Moves.SLACK_OFF, Moves.COMEUPPANCE ], - [Species.NUMEL]: [ Moves.TRICK_ROOM, Moves.ENERGY_BALL, Moves.MORNING_SUN, Moves.BLUE_FLARE ], + [Species.WAILMER]: [ Moves.TAKE_HEART, Moves.COMEUPPANCE, Moves.SLACK_OFF, Moves.STEAM_ERUPTION ], + [Species.NUMEL]: [ Moves.TRICK_ROOM, Moves.ENERGY_BALL, Moves.SLACK_OFF, Moves.BLUE_FLARE ], [Species.TORKOAL]: [ Moves.MORNING_SUN, Moves.BURNING_BULWARK, Moves.BODY_PRESS, Moves.HYDRO_STEAM ], [Species.SPOINK]: [ Moves.AURA_SPHERE, Moves.MILK_DRINK, Moves.EXPANDING_FORCE, Moves.TAIL_GLOW ], [Species.SPINDA]: [ Moves.SUPERPOWER, Moves.SLACK_OFF, Moves.FLEUR_CANNON, Moves.V_CREATE ], [Species.TRAPINCH]: [ Moves.FIRE_LASH, Moves.DRAGON_DARTS, Moves.THOUSAND_ARROWS, Moves.DRAGON_ENERGY ], - [Species.CACNEA]: [ Moves.EARTH_POWER, Moves.CEASELESS_EDGE, Moves.NIGHT_DAZE, Moves.IVY_CUDGEL ], + [Species.CACNEA]: [ Moves.EARTH_POWER, Moves.CEASELESS_EDGE, Moves.NIGHT_DAZE, Moves.SAPPY_SEED ], [Species.SWABLU]: [ Moves.ROOST, Moves.NASTY_PLOT, Moves.FLOATY_FALL, Moves.BOOMBURST ], [Species.ZANGOOSE]: [ Moves.FACADE, Moves.HIGH_HORSEPOWER, Moves.EXTREME_SPEED, Moves.TIDY_UP ], [Species.SEVIPER]: [ Moves.ICE_BEAM, Moves.BITTER_BLADE, Moves.SUCKER_PUNCH, Moves.NO_RETREAT ], - [Species.LUNATONE]: [ Moves.POWER_GEM, Moves.MOONGEIST_BEAM, Moves.SHELL_SMASH, Moves.LUMINA_CRASH ], - [Species.SOLROCK]: [ Moves.PSYSHIELD_BASH, Moves.MIGHTY_CLEAVE, Moves.SHELL_SMASH, Moves.SACRED_FIRE ], + [Species.LUNATONE]: [ Moves.REVELATION_DANCE, Moves.MOONGEIST_BEAM, Moves.SHELL_SMASH, Moves.LUMINA_CRASH ], + [Species.SOLROCK]: [ Moves.MIGHTY_CLEAVE, Moves.PHOTON_GEYSER, Moves.SHELL_SMASH, Moves.SACRED_FIRE ], [Species.BARBOACH]: [ Moves.DRAGON_DANCE, Moves.ZING_ZAP, Moves.ICE_SPINNER, Moves.SURGING_STRIKES ], - [Species.CORPHISH]: [ Moves.CEASELESS_EDGE, Moves.JET_PUNCH, Moves.SUCKER_PUNCH, Moves.SHELL_SMASH ], - [Species.BALTOY]: [ Moves.RECOVER, Moves.STORED_POWER, Moves.BODY_PRESS, Moves.MYSTICAL_POWER ], + [Species.CORPHISH]: [ Moves.CEASELESS_EDGE, Moves.SHELL_SIDE_ARM, Moves.SUCKER_PUNCH, Moves.JET_PUNCH ], + [Species.BALTOY]: [ Moves.RECOVER, Moves.GLARE, Moves.RUINATION, Moves.MYSTICAL_POWER ], [Species.LILEEP]: [ Moves.POWER_GEM, Moves.SCALD, Moves.STRENGTH_SAP, Moves.SAPPY_SEED ], [Species.ANORITH]: [ Moves.FIRST_IMPRESSION, Moves.LEECH_LIFE, Moves.DRAGON_DANCE, Moves.MIGHTY_CLEAVE ], [Species.FEEBAS]: [ Moves.CALM_MIND, Moves.FREEZE_DRY, Moves.MOONBLAST, Moves.STEAM_ERUPTION ], [Species.CASTFORM]: [ Moves.BOOMBURST, Moves.HYDRO_STEAM, Moves.ERUPTION, Moves.QUIVER_DANCE ], [Species.KECLEON]: [ Moves.ZIPPY_ZAP, Moves.COIL, Moves.EXTREME_SPEED, Moves.MULTI_ATTACK ], [Species.SHUPPET]: [ Moves.STORM_THROW, Moves.TIDY_UP, Moves.PARTING_SHOT, Moves.SPECTRAL_THIEF ], - [Species.DUSKULL]: [ Moves.BULK_UP, Moves.DRAIN_PUNCH, Moves.STRENGTH_SAP, Moves.RAGE_FIST ], + [Species.DUSKULL]: [ Moves.BULK_UP, Moves.DRAIN_PUNCH, Moves.RECOVER, Moves.RAGE_FIST ], [Species.TROPIUS]: [ Moves.STUFF_CHEEKS, Moves.EARTH_POWER, Moves.APPLE_ACID, Moves.SAPPY_SEED ], [Species.ABSOL]: [ Moves.KOWTOW_CLEAVE, Moves.SACRED_SWORD, Moves.PSYBLADE, Moves.BITTER_BLADE ], [Species.WYNAUT]: [ Moves.RECOVER, Moves.SHED_TAIL, Moves.TAUNT, Moves.COMEUPPANCE ], @@ -188,21 +190,22 @@ export const speciesEggMoves = { [Species.CLAMPERL]: [ Moves.SHELL_SIDE_ARM, Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ], [Species.RELICANTH]: [ Moves.DRAGON_DANCE, Moves.SHORE_UP, Moves.WAVE_CRASH, Moves.DIAMOND_STORM ], [Species.LUVDISC]: [ Moves.BATON_PASS, Moves.HEART_SWAP, Moves.GLITZY_GLOW, Moves.REVIVAL_BLESSING ], - [Species.BAGON]: [ Moves.FLOATY_FALL, Moves.FIRE_LASH, Moves.DRAGON_DANCE, Moves.GLAIVE_RUSH ], + [Species.BAGON]: [ Moves.FLOATY_FALL, Moves.FIRE_LASH, Moves.DRAGON_DANCE, Moves.DRAGON_DARTS ], [Species.BELDUM]: [ Moves.HEADLONG_RUSH, Moves.DRAIN_PUNCH, Moves.TRIPLE_AXEL, Moves.SHIFT_GEAR ], [Species.REGIROCK]: [ Moves.STONE_AXE, Moves.BODY_PRESS, Moves.SHORE_UP, Moves.SALT_CURE ], [Species.REGICE]: [ Moves.EARTH_POWER, Moves.TAKE_HEART, Moves.RECOVER, Moves.FREEZE_DRY ], [Species.REGISTEEL]: [ Moves.BODY_PRESS, Moves.SIZZLY_SLIDE, Moves.RECOVER, Moves.GIGATON_HAMMER ], [Species.LATIAS]: [ Moves.CORE_ENFORCER, Moves.FUSION_FLARE, Moves.SPARKLY_SWIRL, Moves.MYSTICAL_POWER ], [Species.LATIOS]: [ Moves.CORE_ENFORCER, Moves.BLUE_FLARE, Moves.NASTY_PLOT, Moves.TACHYON_CUTTER ], - [Species.KYOGRE]: [ Moves.RECOVER, Moves.HURRICANE, Moves.FREEZY_FROST, Moves.WILDBOLT_STORM ], + [Species.KYOGRE]: [ Moves.WILDBOLT_STORM, Moves.HURRICANE, Moves.FREEZY_FROST, Moves.BOUNCY_BUBBLE ], [Species.GROUDON]: [ Moves.STONE_AXE, Moves.SOLAR_BLADE, Moves.MORNING_SUN, Moves.SACRED_FIRE ], [Species.RAYQUAZA]: [ Moves.V_CREATE, Moves.DRAGON_DARTS, Moves.CORE_ENFORCER, Moves.OBLIVION_WING ], [Species.JIRACHI]: [ Moves.TACHYON_CUTTER, Moves.TRIPLE_ARROWS, Moves.ROCK_SLIDE, Moves.SHELL_SMASH ], - [Species.DEOXYS]: [ Moves.COLLISION_COURSE, Moves.EARTH_POWER, Moves.PARTING_SHOT, Moves.LUMINA_CRASH ], + [Species.DEOXYS]: [ Moves.COLLISION_COURSE, Moves.FUSION_FLARE, Moves.PARTING_SHOT, Moves.LUMINA_CRASH ], + [Species.TURTWIG]: [ Moves.SHELL_SMASH, Moves.MIGHTY_CLEAVE, Moves.ICE_SPINNER, Moves.SAPPY_SEED ], [Species.CHIMCHAR]: [ Moves.FIERY_DANCE, Moves.SECRET_SWORD, Moves.TRIPLE_AXEL, Moves.SACRED_FIRE ], - [Species.PIPLUP]: [ Moves.KINGS_SHIELD, Moves.TACHYON_CUTTER, Moves.ROOST, Moves.STEAM_ERUPTION ], + [Species.PIPLUP]: [ Moves.KINGS_SHIELD, Moves.TACHYON_CUTTER, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ], [Species.STARLY]: [ Moves.SWORDS_DANCE, Moves.HEAD_CHARGE, Moves.FLARE_BLITZ, Moves.EXTREME_SPEED ], [Species.BIDOOF]: [ Moves.EXTREME_SPEED, Moves.COSMIC_POWER, Moves.POWER_TRIP, Moves.AQUA_STEP ], [Species.KRICKETOT]: [ Moves.BONEMERANG, Moves.VICTORY_DANCE, Moves.STONE_AXE, Moves.POPULATION_BOMB ], @@ -214,7 +217,7 @@ export const speciesEggMoves = { [Species.COMBEE]: [ Moves.SPORE, Moves.FLOATY_FALL, Moves.KINGS_SHIELD, Moves.VICTORY_DANCE ], [Species.PACHIRISU]: [ Moves.FREEZY_FROST, Moves.SIZZLY_SLIDE, Moves.SLACK_OFF, Moves.ZIPPY_ZAP ], [Species.BUIZEL]: [ Moves.JET_PUNCH, Moves.TRIPLE_AXEL, Moves.SUPERCELL_SLAM, Moves.SURGING_STRIKES ], - [Species.CHERUBI]: [ Moves.SPORE, Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.FLOWER_TRICK ], + [Species.CHERUBI]: [ Moves.SLEEP_POWDER, Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.FLOWER_TRICK ], [Species.SHELLOS]: [ Moves.BOUNCY_BUBBLE, Moves.SCORCHING_SANDS, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ], [Species.DRIFLOON]: [ Moves.WILL_O_WISP, Moves.MIND_BLOWN, Moves.CALM_MIND, Moves.OBLIVION_WING ], [Species.BUNEARY]: [ Moves.TRIPLE_AXEL, Moves.SWORDS_DANCE, Moves.THUNDEROUS_KICK, Moves.MULTI_ATTACK ], @@ -225,36 +228,37 @@ export const speciesEggMoves = { [Species.BONSLY]: [ Moves.ACCELEROCK, Moves.SWORDS_DANCE, Moves.STRENGTH_SAP, Moves.SAPPY_SEED ], [Species.MIME_JR]: [ Moves.CHILLY_RECEPTION, Moves.MOONBLAST, Moves.FROST_BREATH, Moves.LUMINA_CRASH ], [Species.HAPPINY]: [ Moves.COTTON_GUARD, Moves.SEISMIC_TOSS, Moves.SIZZLY_SLIDE, Moves.REVIVAL_BLESSING ], - [Species.CHATOT]: [ Moves.SPARKLING_ARIA, Moves.TORCH_SONG, Moves.BATON_PASS, Moves.BOOMBURST ], + [Species.CHATOT]: [ Moves.SPARKLING_ARIA, Moves.BOOMBURST, Moves.BATON_PASS, Moves.TORCH_SONG ], [Species.SPIRITOMB]: [ Moves.PARTING_SHOT, Moves.BADDY_BAD, Moves.STRENGTH_SAP, Moves.SPECTRAL_THIEF ], - [Species.GIBLE]: [ Moves.DRAGON_DANCE, Moves.BITTER_BLADE, Moves.SHORE_UP, Moves.THOUSAND_ARROWS ], + [Species.GIBLE]: [ Moves.DRAGON_DANCE, Moves.BITTER_BLADE, Moves.DRAGON_HAMMER, Moves.PRECIPICE_BLADES ], [Species.MUNCHLAX]: [ Moves.STUFF_CHEEKS, Moves.GRAV_APPLE, Moves.SLACK_OFF, Moves.EXTREME_SPEED ], - [Species.RIOLU]: [ Moves.THUNDEROUS_KICK, Moves.TACHYON_CUTTER, Moves.TRIPLE_AXEL, Moves.DOUBLE_IRON_BASH ], + [Species.RIOLU]: [ Moves.THUNDEROUS_KICK, Moves.TACHYON_CUTTER, Moves.TRIPLE_AXEL, Moves.SUNSTEEL_STRIKE ], [Species.HIPPOPOTAS]: [ Moves.SHORE_UP, Moves.STONE_AXE, Moves.BULK_UP, Moves.SALT_CURE ], [Species.SKORUPI]: [ Moves.COIL, Moves.DIRE_CLAW, Moves.CRABHAMMER, Moves.WICKED_BLOW ], [Species.CROAGUNK]: [ Moves.DIRE_CLAW, Moves.ICE_SPINNER, Moves.THUNDEROUS_KICK, Moves.VICTORY_DANCE ], [Species.CARNIVINE]: [ Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.COIL, Moves.SAPPY_SEED ], [Species.FINNEON]: [ Moves.QUIVER_DANCE, Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.ORIGIN_PULSE ], [Species.MANTYKE]: [ Moves.SPLISHY_SPLASH, Moves.FREEZY_FROST, Moves.NASTY_PLOT, Moves.OBLIVION_WING ], - [Species.SNOVER]: [ Moves.HIGH_HORSEPOWER, Moves.STRENGTH_SAP, Moves.MATCHA_GOTCHA, Moves.SAPPY_SEED ], + [Species.SNOVER]: [ Moves.LANDS_WRATH, Moves.POWDER, Moves.CALM_MIND, Moves.MATCHA_GOTCHA ], [Species.ROTOM]: [ Moves.STRENGTH_SAP, Moves.FIERY_DANCE, Moves.SPLISHY_SPLASH, Moves.ELECTRO_DRIFT ], - [Species.UXIE]: [ Moves.COSMIC_POWER, Moves.BODY_PRESS, Moves.RECOVER, Moves.SPARKLY_SWIRL ], + [Species.UXIE]: [ Moves.COSMIC_POWER, Moves.SECRET_SWORD, Moves.RECOVER, Moves.SPARKLY_SWIRL ], [Species.MESPRIT]: [ Moves.TAIL_GLOW, Moves.AURA_SPHERE, Moves.RECOVER, Moves.LUMINA_CRASH ], [Species.AZELF]: [ Moves.PSYSTRIKE, Moves.ICE_BEAM, Moves.MOONBLAST, Moves.TAIL_GLOW ], [Species.DIALGA]: [ Moves.CORE_ENFORCER, Moves.TAKE_HEART, Moves.RECOVER, Moves.MAKE_IT_RAIN ], - [Species.PALKIA]: [ Moves.RECOVER, Moves.TAKE_HEART, Moves.FREEZE_DRY, Moves.ORIGIN_PULSE ], - [Species.HEATRAN]: [ Moves.MATCHA_GOTCHA, Moves.RECOVER, Moves.TACHYON_CUTTER, Moves.TORCH_SONG ], + [Species.PALKIA]: [ Moves.MALIGNANT_CHAIN, Moves.TAKE_HEART, Moves.RECOVER, Moves.ORIGIN_PULSE ], + [Species.HEATRAN]: [ Moves.MATCHA_GOTCHA, Moves.RECOVER, Moves.ERUPTION, Moves.TACHYON_CUTTER ], [Species.REGIGIGAS]: [ Moves.SKILL_SWAP, Moves.RECOVER, Moves.EXTREME_SPEED, Moves.GIGATON_HAMMER ], [Species.GIRATINA]: [ Moves.DRAGON_DANCE, Moves.GLAIVE_RUSH, Moves.RECOVER, Moves.SPECTRAL_THIEF ], - [Species.CRESSELIA]: [ Moves.COSMIC_POWER, Moves.SECRET_SWORD, Moves.SIZZLY_SLIDE, Moves.LUMINA_CRASH ], - [Species.PHIONE]: [ Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.SPLISHY_SPLASH, Moves.QUIVER_DANCE ], - [Species.MANAPHY]: [ Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.SPLISHY_SPLASH, Moves.QUIVER_DANCE ], + [Species.CRESSELIA]: [ Moves.COSMIC_POWER, Moves.BODY_PRESS, Moves.SIZZLY_SLIDE, Moves.LUMINA_CRASH ], + [Species.PHIONE]: [ Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.STORED_POWER, Moves.ORIGIN_PULSE ], + [Species.MANAPHY]: [ Moves.BOUNCY_BUBBLE, Moves.FROST_BREATH, Moves.WILDBOLT_STORM, Moves.ORIGIN_PULSE ], [Species.DARKRAI]: [ Moves.FIERY_WRATH, Moves.MOONBLAST, Moves.FIERY_DANCE, Moves.MAKE_IT_RAIN ], [Species.SHAYMIN]: [ Moves.MATCHA_GOTCHA, Moves.FIERY_DANCE, Moves.AEROBLAST, Moves.QUIVER_DANCE ], [Species.ARCEUS]: [ Moves.NO_RETREAT, Moves.COLLISION_COURSE, Moves.ASTRAL_BARRAGE, Moves.MULTI_ATTACK ], + [Species.VICTINI]: [ Moves.BLUE_FLARE, Moves.BOLT_STRIKE, Moves.LUSTER_PURGE, Moves.VICTORY_DANCE ], [Species.SNIVY]: [ Moves.FLAMETHROWER, Moves.CLANGING_SCALES, Moves.MAKE_IT_RAIN, Moves.FLEUR_CANNON ], - [Species.TEPIG]: [ Moves.WAVE_CRASH, Moves.VOLT_TACKLE, Moves.DRAIN_PUNCH, Moves.VICTORY_DANCE ], + [Species.TEPIG]: [ Moves.WAVE_CRASH, Moves.VOLT_TACKLE, Moves.AXE_KICK, Moves.VICTORY_DANCE ], [Species.OSHAWOTT]: [ Moves.TRIPLE_AXEL, Moves.SHELL_SIDE_ARM, Moves.SACRED_SWORD, Moves.SHELL_SMASH ], [Species.PATRAT]: [ Moves.FAKE_OUT, Moves.SWORDS_DANCE, Moves.DYNAMIC_PUNCH, Moves.EXTREME_SPEED ], [Species.LILLIPUP]: [ Moves.CLOSE_COMBAT, Moves.BODY_SLAM, Moves.HIGH_HORSEPOWER, Moves.LAST_RESPECTS ], @@ -262,13 +266,13 @@ export const speciesEggMoves = { [Species.PANSAGE]: [ Moves.SWORDS_DANCE, Moves.FIRE_LASH, Moves.EARTHQUAKE, Moves.IVY_CUDGEL ], [Species.PANSEAR]: [ Moves.NASTY_PLOT, Moves.HYDRO_STEAM, Moves.SCORCHING_SANDS, Moves.TORCH_SONG ], [Species.PANPOUR]: [ Moves.NASTY_PLOT, Moves.ENERGY_BALL, Moves.EARTH_POWER, Moves.STEAM_ERUPTION ], - [Species.MUNNA]: [ Moves.COSMIC_POWER, Moves.AURA_SPHERE, Moves.EARTH_POWER, Moves.MYSTICAL_POWER ], + [Species.MUNNA]: [ Moves.COSMIC_POWER, Moves.AURA_SPHERE, Moves.LUNAR_BLESSING, Moves.MYSTICAL_POWER ], [Species.PIDOVE]: [ Moves.GUNK_SHOT, Moves.TIDY_UP, Moves.FLOATY_FALL, Moves.TRIPLE_ARROWS ], [Species.BLITZLE]: [ Moves.HORN_LEECH, Moves.SWORDS_DANCE, Moves.FLARE_BLITZ, Moves.BOLT_STRIKE ], [Species.ROGGENROLA]: [ Moves.BODY_PRESS, Moves.CURSE, Moves.SHORE_UP, Moves.DIAMOND_STORM ], [Species.WOOBAT]: [ Moves.ESPER_WING, Moves.STORED_POWER, Moves.MYSTICAL_FIRE, Moves.OBLIVION_WING ], - [Species.DRILBUR]: [ Moves.IRON_HEAD, Moves.MOUNTAIN_GALE, Moves.SHIFT_GEAR, Moves.THOUSAND_ARROWS ], - [Species.AUDINO]: [ Moves.FOLLOW_ME, Moves.MOONBLAST, Moves.WISH, Moves.LUNAR_BLESSING ], + [Species.DRILBUR]: [ Moves.METEOR_MASH, Moves.MOUNTAIN_GALE, Moves.SHIFT_GEAR, Moves.PRECIPICE_BLADES ], + [Species.AUDINO]: [ Moves.TAKE_HEART, Moves.MOONBLAST, Moves.WISH, Moves.MATCHA_GOTCHA ], [Species.TIMBURR]: [ Moves.MACH_PUNCH, Moves.DRAIN_PUNCH, Moves.ICE_HAMMER, Moves.DOUBLE_IRON_BASH ], [Species.TYMPOLE]: [ Moves.JET_PUNCH, Moves.HIGH_HORSEPOWER, Moves.BULK_UP, Moves.SURGING_STRIKES ], [Species.THROH]: [ Moves.MACH_PUNCH, Moves.SLACK_OFF, Moves.METEOR_MASH, Moves.RAGE_FIST ], @@ -278,41 +282,41 @@ export const speciesEggMoves = { [Species.COTTONEE]: [ Moves.POLLEN_PUFF, Moves.PARTING_SHOT, Moves.SLEEP_POWDER, Moves.SEED_FLARE ], [Species.PETILIL]: [ Moves.THUNDEROUS_KICK, Moves.SPARKLING_ARIA, Moves.FIERY_DANCE, Moves.FLOWER_TRICK ], [Species.BASCULIN]: [ Moves.LAST_RESPECTS, Moves.CLOSE_COMBAT, Moves.SPLISHY_SPLASH, Moves.NO_RETREAT ], - [Species.SANDILE]: [ Moves.DIRE_CLAW, Moves.HIGH_HORSEPOWER, Moves.FIRE_LASH, Moves.WICKED_BLOW ], - [Species.DARUMAKA]: [ Moves.DRAIN_PUNCH, Moves.ZIPPY_ZAP, Moves.EARTHQUAKE, Moves.PYRO_BALL ], + [Species.SANDILE]: [ Moves.DIRE_CLAW, Moves.HEADLONG_RUSH, Moves.FIRE_LASH, Moves.WICKED_BLOW ], + [Species.DARUMAKA]: [ Moves.DRAIN_PUNCH, Moves.ZIPPY_ZAP, Moves.HEADLONG_RUSH, Moves.PYRO_BALL ], [Species.MARACTUS]: [ Moves.EARTH_POWER, Moves.QUIVER_DANCE, Moves.FIERY_DANCE, Moves.SEED_FLARE ], [Species.DWEBBLE]: [ Moves.CRABHAMMER, Moves.STONE_AXE, Moves.LEECH_LIFE, Moves.MIGHTY_CLEAVE ], [Species.SCRAGGY]: [ Moves.SUCKER_PUNCH, Moves.BULLET_PUNCH, Moves.NOXIOUS_TORQUE, Moves.VICTORY_DANCE ], - [Species.SIGILYPH]: [ Moves.MOONBLAST, Moves.CALM_MIND, Moves.FREEZING_GLARE, Moves.OBLIVION_WING ], + [Species.SIGILYPH]: [ Moves.MOONBLAST, Moves.CALM_MIND, Moves.ESPER_WING, Moves.OBLIVION_WING ], [Species.YAMASK]: [ Moves.STRENGTH_SAP, Moves.GLARE, Moves.AURA_SPHERE, Moves.ASTRAL_BARRAGE ], [Species.TIRTOUGA]: [ Moves.ICE_SPINNER, Moves.AQUA_STEP, Moves.SHORE_UP, Moves.MIGHTY_CLEAVE ], [Species.ARCHEN]: [ Moves.ROOST, Moves.EARTHQUAKE, Moves.FLOATY_FALL, Moves.MIGHTY_CLEAVE ], [Species.TRUBBISH]: [ Moves.COIL, Moves.RECOVER, Moves.DIRE_CLAW, Moves.GIGATON_HAMMER ], - [Species.ZORUA]: [ Moves.FLAMETHROWER, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.FIERY_WRATH ], + [Species.ZORUA]: [ Moves.MALIGNANT_CHAIN, Moves.MOONBLAST, Moves.SECRET_SWORD, Moves.FIERY_WRATH ], [Species.MINCCINO]: [ Moves.ICICLE_SPEAR, Moves.TIDY_UP, Moves.KNOCK_OFF, Moves.POPULATION_BOMB ], [Species.GOTHITA]: [ Moves.RECOVER, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.LUMINA_CRASH ], - [Species.SOLOSIS]: [ Moves.EXPANDING_FORCE, Moves.TRICK_ROOM, Moves.AURA_SPHERE, Moves.LIGHT_OF_RUIN ], - [Species.DUCKLETT]: [ Moves.SPLISHY_SPLASH, Moves.EARTH_POWER, Moves.WILDBOLT_STORM, Moves.QUIVER_DANCE ], + [Species.SOLOSIS]: [ Moves.MIST_BALL, Moves.SPEED_SWAP, Moves.FLAMETHROWER, Moves.LIGHT_OF_RUIN ], + [Species.DUCKLETT]: [ Moves.SPLISHY_SPLASH, Moves.SANDSEAR_STORM, Moves.WILDBOLT_STORM, Moves.QUIVER_DANCE ], [Species.VANILLITE]: [ Moves.EARTH_POWER, Moves.AURORA_VEIL, Moves.CALM_MIND, Moves.SPARKLY_SWIRL ], [Species.DEERLING]: [ Moves.TIDY_UP, Moves.FLOWER_TRICK, Moves.BODY_SLAM, Moves.COMBAT_TORQUE ], - [Species.EMOLGA]: [ Moves.TRIPLE_AXEL, Moves.SPLISHY_SPLASH, Moves.FLOATY_FALL, Moves.AURA_WHEEL ], - [Species.KARRABLAST]: [ Moves.LEECH_LIFE, Moves.BITTER_BLADE, Moves.HIGH_HORSEPOWER, Moves.DOUBLE_IRON_BASH ], + [Species.EMOLGA]: [ Moves.ICICLE_CRASH, Moves.ZING_ZAP, Moves.FLOATY_FALL, Moves.ELECTRIFY ], + [Species.KARRABLAST]: [ Moves.LEECH_LIFE, Moves.BITTER_BLADE, Moves.OBSTRUCT, Moves.DOUBLE_IRON_BASH ], [Species.FOONGUS]: [ Moves.POLLEN_PUFF, Moves.PARTING_SHOT, Moves.FOUL_PLAY, Moves.SAPPY_SEED ], - [Species.FRILLISH]: [ Moves.STRENGTH_SAP, Moves.BUZZY_BUZZ, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ], + [Species.FRILLISH]: [ Moves.CALM_MIND, Moves.BUZZY_BUZZ, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ], [Species.ALOMOMOLA]: [ Moves.FLIP_TURN, Moves.HEART_SWAP, Moves.GLITZY_GLOW, Moves.REVIVAL_BLESSING ], [Species.JOLTIK]: [ Moves.WILDBOLT_STORM, Moves.PARABOLIC_CHARGE, Moves.EARTH_POWER, Moves.QUIVER_DANCE ], - [Species.FERROSEED]: [ Moves.STRENGTH_SAP, Moves.BODY_PRESS, Moves.SPIKY_SHIELD, Moves.SAPPY_SEED ], - [Species.KLINK]: [ Moves.TRIPLE_AXEL, Moves.HIGH_HORSEPOWER, Moves.FUSION_BOLT, Moves.DOUBLE_IRON_BASH ], + [Species.FERROSEED]: [ Moves.SYNTHESIS, Moves.COMBAT_TORQUE, Moves.SPIKY_SHIELD, Moves.SAPPY_SEED ], + [Species.KLINK]: [ Moves.TRIPLE_AXEL, Moves.HIGH_HORSEPOWER, Moves.RECOVER, Moves.AURA_WHEEL ], [Species.TYNAMO]: [ Moves.SCALD, Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.AURA_WHEEL ], - [Species.ELGYEM]: [ Moves.LUSTER_PURGE, Moves.BADDY_BAD, Moves.AURA_SPHERE, Moves.TAIL_GLOW ], - [Species.LITWICK]: [ Moves.FIERY_DANCE, Moves.EARTH_POWER, Moves.MOONBLAST, Moves.ASTRAL_BARRAGE ], + [Species.ELGYEM]: [ Moves.THUNDERCLAP, Moves.BADDY_BAD, Moves.AURA_SPHERE, Moves.PHOTON_GEYSER ], + [Species.LITWICK]: [ Moves.PARTING_SHOT, Moves.EARTH_POWER, Moves.MOONBLAST, Moves.TORCH_SONG ], [Species.AXEW]: [ Moves.STONE_AXE, Moves.DIRE_CLAW, Moves.BITTER_BLADE, Moves.GLAIVE_RUSH ], [Species.CUBCHOO]: [ Moves.MOUNTAIN_GALE, Moves.AQUA_STEP, Moves.ICE_SHARD, Moves.COLLISION_COURSE ], [Species.CRYOGONAL]: [ Moves.FREEZING_GLARE, Moves.AURORA_VEIL, Moves.NASTY_PLOT, Moves.ORIGIN_PULSE ], [Species.SHELMET]: [ Moves.POWER_GEM, Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.STEAM_ERUPTION ], - [Species.STUNFISK]: [ Moves.BANEFUL_BUNKER, Moves.SANDSEAR_STORM, Moves.STRENGTH_SAP, Moves.THUNDERCLAP ], - [Species.MIENFOO]: [ Moves.GUNK_SHOT, Moves.SUPERCELL_SLAM, Moves.KNOCK_OFF, Moves.MOUNTAIN_GALE ], - [Species.DRUDDIGON]: [ Moves.FIRE_LASH, Moves.ROOST, Moves.DRAGON_DARTS, Moves.CLANGOROUS_SOUL ], + [Species.STUNFISK]: [ Moves.THUNDERCLAP, Moves.SANDSEAR_STORM, Moves.STRENGTH_SAP, Moves.THUNDER_CAGE ], + [Species.MIENFOO]: [ Moves.GUNK_SHOT, Moves.SUPERCELL_SLAM, Moves.MOUNTAIN_GALE, Moves.WICKED_BLOW ], + [Species.DRUDDIGON]: [ Moves.FIRE_LASH, Moves.MORNING_SUN, Moves.DRAGON_DARTS, Moves.CLANGOROUS_SOUL ], [Species.GOLETT]: [ Moves.SHIFT_GEAR, Moves.DRAIN_PUNCH, Moves.HEADLONG_RUSH, Moves.RAGE_FIST ], [Species.PAWNIARD]: [ Moves.SUCKER_PUNCH, Moves.CEASELESS_EDGE, Moves.BITTER_BLADE, Moves.LAST_RESPECTS ], [Species.BOUFFALANT]: [ Moves.SLACK_OFF, Moves.HIGH_JUMP_KICK, Moves.HEAD_SMASH, Moves.FLARE_BLITZ ], @@ -321,59 +325,62 @@ export const speciesEggMoves = { [Species.HEATMOR]: [ Moves.EARTH_POWER, Moves.OVERHEAT, Moves.THUNDERBOLT, Moves.V_CREATE ], [Species.DURANT]: [ Moves.HIGH_HORSEPOWER, Moves.FIRST_IMPRESSION, Moves.SWORDS_DANCE, Moves.BEHEMOTH_BASH ], [Species.DEINO]: [ Moves.FIERY_WRATH, Moves.ESPER_WING, Moves.SLUDGE_BOMB, Moves.FICKLE_BEAM ], - [Species.LARVESTA]: [ Moves.THUNDERBOLT, Moves.MATCHA_GOTCHA, Moves.EARTH_POWER, Moves.TORCH_SONG ], + [Species.LARVESTA]: [ Moves.THUNDERBOLT, Moves.MAGMA_STORM, Moves.EARTH_POWER, Moves.MATCHA_GOTCHA ], [Species.COBALION]: [ Moves.BEHEMOTH_BLADE, Moves.MIGHTY_CLEAVE, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ], [Species.TERRAKION]: [ Moves.MIGHTY_CLEAVE, Moves.HEADLONG_RUSH, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ], [Species.VIRIZION]: [ Moves.PSYBLADE, Moves.SAPPY_SEED, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ], - [Species.TORNADUS]: [ Moves.EARTH_POWER, Moves.PARTING_SHOT, Moves.ICE_BEAM, Moves.OBLIVION_WING ], - [Species.THUNDURUS]: [ Moves.EARTH_POWER, Moves.HURRICANE, Moves.FROST_BREATH, Moves.ELECTRO_SHOT ], + [Species.TORNADUS]: [ Moves.SANDSEAR_STORM, Moves.PARTING_SHOT, Moves.SPLISHY_SPLASH, Moves.OBLIVION_WING ], + [Species.THUNDURUS]: [ Moves.SANDSEAR_STORM, Moves.HURRICANE, Moves.FROST_BREATH, Moves.ELECTRO_SHOT ], [Species.RESHIRAM]: [ Moves.ENERGY_BALL, Moves.TAKE_HEART, Moves.FICKLE_BEAM, Moves.ERUPTION ], [Species.ZEKROM]: [ Moves.TRIPLE_AXEL, Moves.THUNDEROUS_KICK, Moves.DRAGON_HAMMER, Moves.BOLT_BEAK ], [Species.LANDORUS]: [ Moves.STONE_AXE, Moves.FLOATY_FALL, Moves.ROOST, Moves.BLEAKWIND_STORM ], [Species.KYUREM]: [ Moves.DRAGON_DARTS, Moves.GLACIAL_LANCE, Moves.NO_RETREAT, Moves.DRAGON_ENERGY ], - [Species.KELDEO]: [ Moves.BOUNCY_BUBBLE, Moves.THUNDERBOLT, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ], + [Species.KELDEO]: [ Moves.BOUNCY_BUBBLE, Moves.THUNDERBOLT, Moves.ICE_BEAM, Moves.STEAM_ERUPTION ], [Species.MELOETTA]: [ Moves.BODY_SLAM, Moves.TORCH_SONG, Moves.TRIPLE_ARROWS, Moves.BOOMBURST ], - [Species.GENESECT]: [ Moves.EXTREME_SPEED, Moves.U_TURN, Moves.TACHYON_CUTTER, Moves.TAIL_GLOW ], - [Species.CHESPIN]: [ Moves.BODY_PRESS, Moves.SYNTHESIS, Moves.CEASELESS_EDGE, Moves.SAPPY_SEED ], - [Species.FENNEKIN]: [ Moves.EXPANDING_FORCE, Moves.MOONBLAST, Moves.THUNDERBOLT, Moves.TORCH_SONG ], + [Species.GENESECT]: [ Moves.EXTREME_SPEED, Moves.SHIFT_GEAR, Moves.BEHEMOTH_BASH, Moves.TACHYON_CUTTER ], + + [Species.CHESPIN]: [ Moves.COMBAT_TORQUE, Moves.SYNTHESIS, Moves.CEASELESS_EDGE, Moves.SAPPY_SEED ], + [Species.FENNEKIN]: [ Moves.TWIN_BEAM, Moves.FIERY_DANCE, Moves.THUNDERBOLT, Moves.SPARKLY_SWIRL ], [Species.FROAKIE]: [ Moves.MOONBLAST, Moves.SHELL_SIDE_ARM, Moves.FIERY_WRATH, Moves.STEAM_ERUPTION ], [Species.BUNNELBY]: [ Moves.DRAIN_PUNCH, Moves.TIDY_UP, Moves.FACADE, Moves.EXTREME_SPEED ], [Species.FLETCHLING]: [ Moves.DRILL_RUN, Moves.BURNING_BULWARK, Moves.HEAD_SMASH, Moves.VOLT_TACKLE ], [Species.SCATTERBUG]: [ Moves.FOCUS_BLAST, Moves.AFTER_YOU, Moves.DECORATE, Moves.BLIZZARD ], - [Species.LITLEO]: [ Moves.EARTH_POWER, Moves.NASTY_PLOT, Moves.YAWN, Moves.TORCH_SONG ], + [Species.LITLEO]: [ Moves.EARTH_POWER, Moves.NASTY_PLOT, Moves.BURNING_BULWARK, Moves.BLUE_FLARE ], [Species.FLABEBE]: [ Moves.GLITZY_GLOW, Moves.MYSTICAL_FIRE, Moves.TAKE_HEART, Moves.SEED_FLARE ], [Species.SKIDDO]: [ Moves.HIGH_HORSEPOWER, Moves.GRASSY_GLIDE, Moves.STONE_AXE, Moves.SAPPY_SEED ], [Species.PANCHAM]: [ Moves.DRAIN_PUNCH, Moves.SUCKER_PUNCH, Moves.METEOR_MASH, Moves.WICKED_BLOW ], [Species.FURFROU]: [ Moves.TIDY_UP, Moves.SLACK_OFF, Moves.COMBAT_TORQUE, Moves.MULTI_ATTACK ], [Species.ESPURR]: [ Moves.LUSTER_PURGE, Moves.MOONBLAST, Moves.AURA_SPHERE, Moves.DARK_VOID ], [Species.HONEDGE]: [ Moves.TACHYON_CUTTER, Moves.SHADOW_BONE, Moves.BITTER_BLADE, Moves.BEHEMOTH_BLADE ], - [Species.SPRITZEE]: [ Moves.SPEED_SWAP, Moves.TORCH_SONG, Moves.ROOST, Moves.REVIVAL_BLESSING ], + [Species.SPRITZEE]: [ Moves.SPEED_SWAP, Moves.REVIVAL_BLESSING, Moves.ROOST, Moves.TORCH_SONG ], [Species.SWIRLIX]: [ Moves.BELLY_DRUM, Moves.HEADLONG_RUSH, Moves.MAGICAL_TORQUE, Moves.REVIVAL_BLESSING ], [Species.INKAY]: [ Moves.POWER_TRIP, Moves.SPIN_OUT, Moves.RECOVER, Moves.PSYCHO_BOOST ], [Species.BINACLE]: [ Moves.TRIPLE_AXEL, Moves.CRABHAMMER, Moves.DIRE_CLAW, Moves.MIGHTY_CLEAVE ], [Species.SKRELP]: [ Moves.STRENGTH_SAP, Moves.TRICK_ROOM, Moves.CALM_MIND, Moves.CORE_ENFORCER ], - [Species.CLAUNCHER]: [ Moves.SHELL_SMASH, Moves.ARMOR_CANNON, Moves.WATER_SHURIKEN, Moves.ORIGIN_PULSE ], + [Species.CLAUNCHER]: [ Moves.SHELL_SMASH, Moves.ARMOR_CANNON, Moves.ENERGY_BALL, Moves.ORIGIN_PULSE ], [Species.HELIOPTILE]: [ Moves.WEATHER_BALL, Moves.HYDRO_STEAM, Moves.EARTH_POWER, Moves.BOOMBURST ], [Species.TYRUNT]: [ Moves.DRAGON_HAMMER, Moves.FLARE_BLITZ, Moves.VOLT_TACKLE, Moves.SHIFT_GEAR ], - [Species.AMAURA]: [ Moves.RECOVER, Moves.AURORA_VEIL, Moves.POWER_GEM, Moves.GEOMANCY ], + [Species.AMAURA]: [ Moves.RECOVER, Moves.WRING_OUT, Moves.POWER_GEM, Moves.GEOMANCY ], [Species.HAWLUCHA]: [ Moves.TRIPLE_AXEL, Moves.HIGH_HORSEPOWER, Moves.FLOATY_FALL, Moves.WICKED_BLOW ], [Species.DEDENNE]: [ Moves.BOOMBURST, Moves.FAKE_OUT, Moves.NASTY_PLOT, Moves.REVIVAL_BLESSING ], [Species.CARBINK]: [ Moves.BODY_PRESS, Moves.SHORE_UP, Moves.SPARKLY_SWIRL, Moves.DIAMOND_STORM ], - [Species.GOOMY]: [ Moves.SCALD, Moves.RECOVER, Moves.CALM_MIND, Moves.MAKE_IT_RAIN ], + [Species.GOOMY]: [ Moves.DRAGON_HAMMER, Moves.RECOVER, Moves.CALM_MIND, Moves.MAKE_IT_RAIN ], [Species.KLEFKI]: [ Moves.HEAL_BELL, Moves.ENCORE, Moves.INSTRUCT, Moves.TOPSY_TURVY ], - [Species.PHANTUMP]: [ Moves.RAGE_FIST, Moves.TRICK_ROOM, Moves.SYNTHESIS, Moves.SAPPY_SEED ], + [Species.PHANTUMP]: [ Moves.RAGE_FIST, Moves.SLEEP_POWDER, Moves.SYNTHESIS, Moves.SAPPY_SEED ], [Species.PUMPKABOO]: [ Moves.SPIRIT_SHACKLE, Moves.FIRE_LASH, Moves.DIRE_CLAW, Moves.SAPPY_SEED ], [Species.BERGMITE]: [ Moves.STONE_AXE, Moves.METAL_BURST, Moves.BODY_PRESS, Moves.GLACIAL_LANCE ], [Species.NOIBAT]: [ Moves.AEROBLAST, Moves.OVERDRIVE, Moves.NASTY_PLOT, Moves.CLANGING_SCALES ], [Species.XERNEAS]: [ Moves.EARTH_POWER, Moves.SPRINGTIDE_STORM, Moves.STRENGTH_SAP, Moves.TAIL_GLOW ], [Species.YVELTAL]: [ Moves.SHELL_SIDE_ARM, Moves.POWER_TRIP, Moves.FIERY_WRATH, Moves.CLANGOROUS_SOUL ], [Species.ZYGARDE]: [ Moves.DRAGON_DARTS, Moves.HEAL_ORDER, Moves.CLANGOROUS_SOUL, Moves.DOUBLE_IRON_BASH ], - [Species.DIANCIE]: [ Moves.MAGICAL_TORQUE, Moves.AURA_SPHERE, Moves.SHORE_UP, Moves.GEOMANCY ], + [Species.DIANCIE]: [ Moves.MAGICAL_TORQUE, Moves.FIERY_DANCE, Moves.SHORE_UP, Moves.GEOMANCY ], [Species.HOOPA]: [ Moves.PHOTON_GEYSER, Moves.SECRET_SWORD, Moves.FIERY_WRATH, Moves.SHELL_SMASH ], [Species.VOLCANION]: [ Moves.HYDRO_STEAM, Moves.CALM_MIND, Moves.ENERGY_BALL, Moves.MAGMA_STORM ], + [Species.ETERNAL_FLOETTE]: [ Moves.MIND_BLOWN, Moves.CHLOROBLAST, Moves.LUSTER_PURGE, Moves.QUIVER_DANCE ], + [Species.ROWLET]: [ Moves.THOUSAND_ARROWS, Moves.SHADOW_BONE, Moves.FIRST_IMPRESSION, Moves.VICTORY_DANCE ], - [Species.LITTEN]: [ Moves.FAKE_OUT, Moves.PARTING_SHOT, Moves.MORNING_SUN, Moves.SACRED_FIRE ], - [Species.POPPLIO]: [ Moves.PSYCHIC_NOISE, Moves.BOUNCY_BUBBLE, Moves.ALLURING_VOICE, Moves.TORCH_SONG ], + [Species.LITTEN]: [ Moves.SUCKER_PUNCH, Moves.PARTING_SHOT, Moves.SLACK_OFF, Moves.SACRED_FIRE ], + [Species.POPPLIO]: [ Moves.PSYCHIC_NOISE, Moves.BOUNCY_BUBBLE, Moves.OVERDRIVE, Moves.TORCH_SONG ], [Species.PIKIPEK]: [ Moves.DUAL_WINGBEAT, Moves.BONE_RUSH, Moves.BURNING_BULWARK, Moves.POPULATION_BOMB ], [Species.YUNGOOS]: [ Moves.EXTREME_SPEED, Moves.KNOCK_OFF, Moves.TIDY_UP, Moves.MULTI_ATTACK ], [Species.GRUBBIN]: [ Moves.ICE_BEAM, Moves.EARTH_POWER, Moves.THUNDERCLAP, Moves.QUIVER_DANCE ], @@ -381,7 +388,7 @@ export const speciesEggMoves = { [Species.ORICORIO]: [ Moves.QUIVER_DANCE, Moves.FIERY_DANCE, Moves.THUNDERCLAP, Moves.OBLIVION_WING ], [Species.CUTIEFLY]: [ Moves.STICKY_WEB, Moves.SLEEP_POWDER, Moves.HEAT_WAVE, Moves.SPARKLY_SWIRL ], [Species.ROCKRUFF]: [ Moves.HIGH_HORSEPOWER, Moves.TIDY_UP, Moves.ICE_SPINNER, Moves.MIGHTY_CLEAVE ], - [Species.WISHIWASHI]: [ Moves.HEAL_ORDER, Moves.ICE_SPINNER, Moves.DRAGON_DANCE, Moves.JET_PUNCH ], + [Species.WISHIWASHI]: [ Moves.HEAL_ORDER, Moves.FREEZE_DRY, Moves.WATER_SHURIKEN, Moves.TAIL_GLOW ], [Species.MAREANIE]: [ Moves.CEASELESS_EDGE, Moves.SIZZLY_SLIDE, Moves.BODY_PRESS, Moves.LEECH_SEED ], [Species.MUDBRAY]: [ Moves.BODY_PRESS, Moves.YAWN, Moves.SHORE_UP, Moves.THOUSAND_WAVES ], [Species.DEWPIDER]: [ Moves.JET_PUNCH, Moves.SILK_TRAP, Moves.SWORDS_DANCE, Moves.AQUA_STEP ], @@ -392,27 +399,27 @@ export const speciesEggMoves = { [Species.BOUNSWEET]: [ Moves.TRIPLE_AXEL, Moves.AQUA_STEP, Moves.THUNDEROUS_KICK, Moves.SAPPY_SEED ], [Species.COMFEY]: [ Moves.REVIVAL_BLESSING, Moves.TAKE_HEART, Moves.STRENGTH_SAP, Moves.MATCHA_GOTCHA ], [Species.ORANGURU]: [ Moves.JUNGLE_HEALING, Moves.YAWN, Moves.FOLLOW_ME, Moves.LUMINA_CRASH ], - [Species.PASSIMIAN]: [ Moves.FAKE_OUT, Moves.SUCKER_PUNCH, Moves.ZING_ZAP, Moves.PYRO_BALL ], + [Species.PASSIMIAN]: [ Moves.PYRO_BALL, Moves.SUCKER_PUNCH, Moves.ZING_ZAP, Moves.VICTORY_DANCE ], [Species.WIMPOD]: [ Moves.TRIPLE_AXEL, Moves.OBSTRUCT, Moves.JET_PUNCH, Moves.SURGING_STRIKES ], - [Species.SANDYGAST]: [ Moves.SANDSEAR_STORM, Moves.SPLISHY_SPLASH, Moves.TAKE_HEART, Moves.SALT_CURE ], + [Species.SANDYGAST]: [ Moves.BITTER_MALICE, Moves.SPLISHY_SPLASH, Moves.TAKE_HEART, Moves.SALT_CURE ], [Species.PYUKUMUKU]: [ Moves.COMEUPPANCE, Moves.BANEFUL_BUNKER, Moves.TOXIC_SPIKES, Moves.SALT_CURE ], - [Species.TYPE_NULL]: [ Moves.DIRE_CLAW, Moves.RECOVER, Moves.EXTREME_SPEED, Moves.SHELL_SMASH ], + [Species.TYPE_NULL]: [ Moves.DIRE_CLAW, Moves.RECOVER, Moves.COMBAT_TORQUE, Moves.NO_RETREAT ], [Species.MINIOR]: [ Moves.EARTH_POWER, Moves.FLOATY_FALL, Moves.ZING_ZAP, Moves.DIAMOND_STORM ], [Species.KOMALA]: [ Moves.SLACK_OFF, Moves.EXTREME_SPEED, Moves.KNOCK_OFF, Moves.COLLISION_COURSE ], [Species.TURTONATOR]: [ Moves.BURNING_BULWARK, Moves.MORNING_SUN, Moves.BODY_PRESS, Moves.CORE_ENFORCER ], [Species.TOGEDEMARU]: [ Moves.FAKE_OUT, Moves.METAL_BURST, Moves.METEOR_MASH, Moves.AURA_WHEEL ], - [Species.MIMIKYU]: [ Moves.SPIRIT_BREAK, Moves.TIDY_UP, Moves.BITTER_BLADE, Moves.SPECTRAL_THIEF ], + [Species.MIMIKYU]: [ Moves.SPIRIT_BREAK, Moves.TIDY_UP, Moves.FIRE_LASH, Moves.SPECTRAL_THIEF ], [Species.BRUXISH]: [ Moves.PLAY_ROUGH, Moves.FIRE_FANG, Moves.DRAGON_DANCE, Moves.SURGING_STRIKES ], [Species.DRAMPA]: [ Moves.SLACK_OFF, Moves.TRICK_ROOM, Moves.CORE_ENFORCER, Moves.BOOMBURST ], - [Species.DHELMISE]: [ Moves.SHADOW_BONE, Moves.STRENGTH_SAP, Moves.LIQUIDATION, Moves.SAPPY_SEED ], + [Species.DHELMISE]: [ Moves.SHADOW_BONE, Moves.IVY_CUDGEL, Moves.TRIPLE_DIVE, Moves.STRENGTH_SAP ], [Species.JANGMO_O]: [ Moves.BODY_PRESS, Moves.SHELL_SIDE_ARM, Moves.SECRET_SWORD, Moves.GLAIVE_RUSH ], - [Species.TAPU_KOKO]: [ Moves.MAGICAL_TORQUE, Moves.TRIPLE_AXEL, Moves.RISING_VOLTAGE, Moves.BOLT_STRIKE ], + [Species.TAPU_KOKO]: [ Moves.MAGICAL_TORQUE, Moves.TRIPLE_AXEL, Moves.SWORDS_DANCE, Moves.BOLT_STRIKE ], [Species.TAPU_LELE]: [ Moves.MOONLIGHT, Moves.NASTY_PLOT, Moves.HEAT_WAVE, Moves.EXPANDING_FORCE ], [Species.TAPU_BULU]: [ Moves.SAPPY_SEED, Moves.DRAIN_PUNCH, Moves.MAGICAL_TORQUE, Moves.VICTORY_DANCE ], [Species.TAPU_FINI]: [ Moves.AURA_SPHERE, Moves.EARTH_POWER, Moves.RECOVER, Moves.QUIVER_DANCE ], [Species.COSMOG]: [ Moves.PHOTON_GEYSER, Moves.PRECIPICE_BLADES, Moves.SACRED_FIRE, Moves.ASTRAL_BARRAGE ], [Species.NIHILEGO]: [ Moves.STRENGTH_SAP, Moves.MALIGNANT_CHAIN, Moves.EARTH_POWER, Moves.QUIVER_DANCE ], - [Species.BUZZWOLE]: [ Moves.FIRST_IMPRESSION, Moves.COMBAT_TORQUE, Moves.ROCK_WRECKER, Moves.DOUBLE_IRON_BASH ], + [Species.BUZZWOLE]: [ Moves.FIRST_IMPRESSION, Moves.COMBAT_TORQUE, Moves.ROCK_BLAST, Moves.DOUBLE_IRON_BASH ], [Species.PHEROMOSA]: [ Moves.SECRET_SWORD, Moves.MAKE_IT_RAIN, Moves.ATTACK_ORDER, Moves.DIAMOND_STORM ], [Species.XURKITREE]: [ Moves.FLAMETHROWER, Moves.GIGA_DRAIN, Moves.TAIL_GLOW, Moves.THUNDERCLAP ], [Species.CELESTEELA]: [ Moves.RECOVER, Moves.BUZZY_BUZZ, Moves.SANDSEAR_STORM, Moves.OBLIVION_WING ], @@ -421,11 +428,19 @@ export const speciesEggMoves = { [Species.NECROZMA]: [ Moves.DYNAMAX_CANNON, Moves.SACRED_FIRE, Moves.ASTRAL_BARRAGE, Moves.CLANGOROUS_SOUL ], [Species.MAGEARNA]: [ Moves.STRENGTH_SAP, Moves.EARTH_POWER, Moves.MOONBLAST, Moves.MAKE_IT_RAIN ], [Species.MARSHADOW]: [ Moves.POWER_UP_PUNCH, Moves.TRIPLE_AXEL, Moves.METEOR_MASH, Moves.STORM_THROW ], - [Species.POIPOLE]: [ Moves.CORE_ENFORCER, Moves.ICE_BEAM, Moves.SEARING_SHOT, Moves.MALIGNANT_CHAIN ], + [Species.POIPOLE]: [ Moves.MALIGNANT_CHAIN, Moves.ICE_BEAM, Moves.ARMOR_CANNON, Moves.CLANGING_SCALES ], [Species.STAKATAKA]: [ Moves.HEAVY_SLAM, Moves.SHORE_UP, Moves.CURSE, Moves.SALT_CURE ], - [Species.BLACEPHALON]: [ Moves.NASTY_PLOT, Moves.AURA_SPHERE, Moves.CHLOROBLAST, Moves.ASTRAL_BARRAGE ], + [Species.BLACEPHALON]: [ Moves.STEEL_BEAM, Moves.MOONBLAST, Moves.CHLOROBLAST, Moves.MOONGEIST_BEAM ], [Species.ZERAORA]: [ Moves.SWORDS_DANCE, Moves.TRIPLE_AXEL, Moves.BOLT_STRIKE, Moves.PYRO_BALL ], [Species.MELTAN]: [ Moves.BULLET_PUNCH, Moves.DRAIN_PUNCH, Moves.BULK_UP, Moves.PLASMA_FISTS ], + [Species.ALOLA_RATTATA]: [ Moves.FALSE_SURRENDER, Moves.PSYCHIC_FANGS, Moves.COIL, Moves.EXTREME_SPEED ], + [Species.ALOLA_SANDSHREW]: [ Moves.SPIKY_SHIELD, Moves.AQUA_CUTTER, Moves.SHIFT_GEAR, Moves.GLACIAL_LANCE ], + [Species.ALOLA_VULPIX]: [ Moves.MOONBLAST, Moves.PARTING_SHOT, Moves.EARTH_POWER, Moves.REVIVAL_BLESSING ], + [Species.ALOLA_DIGLETT]: [ Moves.THOUSAND_WAVES, Moves.SWORDS_DANCE, Moves.TRIPLE_DIVE, Moves.MOUNTAIN_GALE ], + [Species.ALOLA_MEOWTH]: [ Moves.BADDY_BAD, Moves.BUZZY_BUZZ, Moves.PARTING_SHOT, Moves.MAKE_IT_RAIN ], + [Species.ALOLA_GEODUDE]: [ Moves.THOUSAND_WAVES, Moves.BULK_UP, Moves.STONE_AXE, Moves.EXTREME_SPEED ], + [Species.ALOLA_GRIMER]: [ Moves.SUCKER_PUNCH, Moves.BARB_BARRAGE, Moves.RECOVER, Moves.SURGING_STRIKES ], + [Species.GROOKEY]: [ Moves.HIGH_HORSEPOWER, Moves.CLANGOROUS_SOUL, Moves.GRASSY_GLIDE, Moves.SAPPY_SEED ], [Species.SCORBUNNY]: [ Moves.EXTREME_SPEED, Moves.HIGH_JUMP_KICK, Moves.TRIPLE_AXEL, Moves.BOLT_STRIKE ], [Species.SOBBLE]: [ Moves.AEROBLAST, Moves.FROST_BREATH, Moves.ENERGY_BALL, Moves.NASTY_PLOT ], @@ -433,15 +448,15 @@ export const speciesEggMoves = { [Species.ROOKIDEE]: [ Moves.ROOST, Moves.BODY_PRESS, Moves.KINGS_SHIELD, Moves.BEHEMOTH_BASH ], [Species.BLIPBUG]: [ Moves.HEAL_ORDER, Moves.LUSTER_PURGE, Moves.SLEEP_POWDER, Moves.TAIL_GLOW ], [Species.NICKIT]: [ Moves.BADDY_BAD, Moves.FLAMETHROWER, Moves.SPARKLY_SWIRL, Moves.MAKE_IT_RAIN ], - [Species.GOSSIFLEUR]: [ Moves.TAILWIND, Moves.STRENGTH_SAP, Moves.SAPPY_SEED, Moves.SEED_FLARE ], + [Species.GOSSIFLEUR]: [ Moves.PARTING_SHOT, Moves.STRENGTH_SAP, Moves.SAPPY_SEED, Moves.SEED_FLARE ], [Species.WOOLOO]: [ Moves.PSYSHIELD_BASH, Moves.MILK_DRINK, Moves.BODY_PRESS, Moves.MULTI_ATTACK ], - [Species.CHEWTLE]: [ Moves.ICE_FANG, Moves.ACCELEROCK, Moves.SHELL_SMASH, Moves.FISHIOUS_REND ], + [Species.CHEWTLE]: [ Moves.ICE_FANG, Moves.PSYCHIC_FANGS, Moves.SHELL_SMASH, Moves.MIGHTY_CLEAVE ], [Species.YAMPER]: [ Moves.ICE_FANG, Moves.SWORDS_DANCE, Moves.THUNDER_FANG, Moves.BOLT_STRIKE ], [Species.ROLYCOLY]: [ Moves.BITTER_BLADE, Moves.BODY_PRESS, Moves.BULK_UP, Moves.DIAMOND_STORM ], - [Species.APPLIN]: [ Moves.MATCHA_GOTCHA, Moves.DRAGON_HAMMER, Moves.FLOWER_TRICK, Moves.STRENGTH_SAP ], + [Species.APPLIN]: [ Moves.CORE_ENFORCER, Moves.DRAGON_HAMMER, Moves.FLOWER_TRICK, Moves.MATCHA_GOTCHA ], [Species.SILICOBRA]: [ Moves.SHORE_UP, Moves.SHED_TAIL, Moves.MOUNTAIN_GALE, Moves.THOUSAND_ARROWS ], [Species.CRAMORANT]: [ Moves.APPLE_ACID, Moves.SURF, Moves.SCORCHING_SANDS, Moves.OBLIVION_WING ], - [Species.ARROKUDA]: [ Moves.SUPERCELL_SLAM, Moves.KNOCK_OFF, Moves.ICE_SPINNER, Moves.FILLET_AWAY ], + [Species.ARROKUDA]: [ Moves.SUPERCELL_SLAM, Moves.TRIPLE_DIVE, Moves.ICE_SPINNER, Moves.SWORDS_DANCE ], [Species.TOXEL]: [ Moves.NASTY_PLOT, Moves.BUG_BUZZ, Moves.SPARKLING_ARIA, Moves.TORCH_SONG ], [Species.SIZZLIPEDE]: [ Moves.BURNING_BULWARK, Moves.ZING_ZAP, Moves.FIRST_IMPRESSION, Moves.BITTER_BLADE ], [Species.CLOBBOPUS]: [ Moves.STORM_THROW, Moves.JET_PUNCH, Moves.MACH_PUNCH, Moves.SURGING_STRIKES ], @@ -450,19 +465,19 @@ export const speciesEggMoves = { [Species.IMPIDIMP]: [ Moves.ENCORE, Moves.PARTING_SHOT, Moves.TOPSY_TURVY, Moves.WICKED_BLOW ], [Species.MILCERY]: [ Moves.MOONBLAST, Moves.CHILLY_RECEPTION, Moves.EARTH_POWER, Moves.GEOMANCY ], [Species.FALINKS]: [ Moves.COMBAT_TORQUE, Moves.PSYSHIELD_BASH, Moves.HEAL_ORDER, Moves.POPULATION_BOMB ], - [Species.PINCURCHIN]: [ Moves.TRICK_ROOM, Moves.RISING_VOLTAGE, Moves.STRENGTH_SAP, Moves.THUNDERCLAP ], + [Species.PINCURCHIN]: [ Moves.TRICK_ROOM, Moves.VOLT_SWITCH, Moves.STRENGTH_SAP, Moves.THUNDERCLAP ], [Species.SNOM]: [ Moves.FROST_BREATH, Moves.HEAL_ORDER, Moves.EARTH_POWER, Moves.SPORE ], [Species.STONJOURNER]: [ Moves.BODY_PRESS, Moves.HELPING_HAND, Moves.ACCELEROCK, Moves.DIAMOND_STORM ], - [Species.EISCUE]: [ Moves.TRIPLE_AXEL, Moves.AQUA_STEP, Moves.SHELL_SMASH, Moves.GLACIAL_LANCE ], + [Species.EISCUE]: [ Moves.TRIPLE_AXEL, Moves.AQUA_STEP, Moves.AXE_KICK, Moves.SHELL_SMASH ], [Species.INDEEDEE]: [ Moves.MATCHA_GOTCHA, Moves.EXPANDING_FORCE, Moves.MOONBLAST, Moves.REVIVAL_BLESSING ], [Species.MORPEKO]: [ Moves.TRIPLE_AXEL, Moves.OBSTRUCT, Moves.SWORDS_DANCE, Moves.COLLISION_COURSE ], [Species.CUFANT]: [ Moves.LIQUIDATION, Moves.CURSE, Moves.COMBAT_TORQUE, Moves.GIGATON_HAMMER ], - [Species.DRACOZOLT]: [ Moves.TRIPLE_AXEL, Moves.SCALE_SHOT, Moves.FIRE_LASH, Moves.DRAGON_DANCE ], + [Species.DRACOZOLT]: [ Moves.TRIPLE_AXEL, Moves.GUNK_SHOT, Moves.FIRE_LASH, Moves.DRAGON_DANCE ], [Species.ARCTOZOLT]: [ Moves.MOUNTAIN_GALE, Moves.AQUA_STEP, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ], [Species.DRACOVISH]: [ Moves.TRIPLE_AXEL, Moves.DRAGON_HAMMER, Moves.THUNDER_FANG, Moves.DRAGON_DANCE ], [Species.ARCTOVISH]: [ Moves.ICE_FANG, Moves.THUNDER_FANG, Moves.HIGH_HORSEPOWER, Moves.SHIFT_GEAR ], [Species.DURALUDON]: [ Moves.CORE_ENFORCER, Moves.BODY_PRESS, Moves.RECOVER, Moves.TACHYON_CUTTER ], - [Species.DREEPY]: [ Moves.SHADOW_BONE, Moves.NASTY_PLOT, Moves.FIRE_LASH, Moves.COLLISION_COURSE ], + [Species.DREEPY]: [ Moves.SHADOW_BONE, Moves.POWER_UP_PUNCH, Moves.FIRE_LASH, Moves.DIRE_CLAW ], [Species.ZACIAN]: [ Moves.MAGICAL_TORQUE, Moves.MIGHTY_CLEAVE, Moves.BITTER_BLADE, Moves.PRECIPICE_BLADES ], [Species.ZAMAZENTA]: [ Moves.BULK_UP, Moves.BODY_PRESS, Moves.SLACK_OFF, Moves.DIAMOND_STORM ], [Species.ETERNATUS]: [ Moves.BODY_PRESS, Moves.NASTY_PLOT, Moves.MALIGNANT_CHAIN, Moves.DRAGON_ENERGY ], @@ -470,18 +485,36 @@ export const speciesEggMoves = { [Species.ZARUDE]: [ Moves.SAPPY_SEED, Moves.MIGHTY_CLEAVE, Moves.WICKED_BLOW, Moves.VICTORY_DANCE ], [Species.REGIELEKI]: [ Moves.NASTY_PLOT, Moves.ICE_BEAM, Moves.EARTH_POWER, Moves.ELECTRO_DRIFT ], [Species.REGIDRAGO]: [ Moves.METEOR_MASH, Moves.FLAMETHROWER, Moves.TAKE_HEART, Moves.DRAGON_DARTS ], - [Species.GLASTRIER]: [ Moves.TRICK_ROOM, Moves.SLACK_OFF, Moves.HIGH_HORSEPOWER, Moves.GLACIAL_LANCE ], + [Species.GLASTRIER]: [ Moves.SPEED_SWAP, Moves.SLACK_OFF, Moves.HIGH_HORSEPOWER, Moves.GLACIAL_LANCE ], [Species.SPECTRIER]: [ Moves.EARTH_POWER, Moves.PARTING_SHOT, Moves.AURA_SPHERE, Moves.ASTRAL_BARRAGE ], [Species.CALYREX]: [ Moves.SAPPY_SEED, Moves.RECOVER, Moves.SECRET_SWORD, Moves.PHOTON_GEYSER ], - [Species.ENAMORUS]: [ Moves.FLEUR_CANNON, Moves.TAKE_HEART, Moves.STORED_POWER, Moves.OBLIVION_WING ], + [Species.ENAMORUS]: [ Moves.AEROBLAST, Moves.THOUSAND_ARROWS, Moves.STORED_POWER, Moves.FLEUR_CANNON ], + [Species.GALAR_MEOWTH]: [ Moves.LIQUIDATION, Moves.HORN_LEECH, Moves.BULLET_PUNCH, Moves.BEHEMOTH_BASH ], + [Species.GALAR_PONYTA]: [ Moves.MAGICAL_TORQUE, Moves.EXTREME_SPEED, Moves.FLARE_BLITZ, Moves.PHOTON_GEYSER ], + [Species.GALAR_SLOWPOKE]: [ Moves.SHED_TAIL, Moves.BADDY_BAD, Moves.MOONBLAST, Moves.PHOTON_GEYSER ], + [Species.GALAR_FARFETCHD]: [ Moves.ROOST, Moves.SACRED_SWORD, Moves.KINGS_SHIELD, Moves.BEHEMOTH_BLADE ], + [Species.GALAR_ARTICUNO]: [ Moves.SECRET_SWORD, Moves.NIGHT_DAZE, Moves.ICE_BEAM, Moves.OBLIVION_WING ], + [Species.GALAR_ZAPDOS]: [ Moves.TIDY_UP, Moves.FLOATY_FALL, Moves.ROOST, Moves.BOLT_BEAK ], + [Species.GALAR_MOLTRES]: [ Moves.ROOST, Moves.SLUDGE_BOMB, Moves.FLAMETHROWER, Moves.OBLIVION_WING ], + [Species.GALAR_CORSOLA]: [ Moves.SHELL_SMASH, Moves.AURA_SPHERE, Moves.INFERNAL_PARADE, Moves.ASTRAL_BARRAGE ], + [Species.GALAR_ZIGZAGOON]: [ Moves.CEASELESS_EDGE, Moves.FACADE, Moves.PARTING_SHOT, Moves.EXTREME_SPEED ], + [Species.GALAR_DARUMAKA]: [ Moves.ICE_SPINNER, Moves.ZING_ZAP, Moves.DRAIN_PUNCH, Moves.PYRO_BALL ], + [Species.GALAR_YAMASK]: [ Moves.STRENGTH_SAP, Moves.DIRE_CLAW, Moves.THOUSAND_WAVES, Moves.SPECTRAL_THIEF ], + [Species.GALAR_STUNFISK]: [ Moves.SPIKY_SHIELD, Moves.THOUSAND_ARROWS, Moves.STRENGTH_SAP, Moves.DOUBLE_IRON_BASH ], + [Species.HISUI_GROWLITHE]: [ Moves.WAVE_CRASH, Moves.HEAD_SMASH, Moves.VOLT_TACKLE, Moves.DRAGON_DANCE ], + [Species.HISUI_VOLTORB]: [ Moves.FROST_BREATH, Moves.NASTY_PLOT, Moves.APPLE_ACID, Moves.ELECTRO_DRIFT ], + [Species.HISUI_QWILFISH]: [ Moves.CEASELESS_EDGE, Moves.KNOCK_OFF, Moves.RECOVER, Moves.FISHIOUS_REND ], + [Species.HISUI_SNEASEL]: [ Moves.DRAIN_PUNCH, Moves.KNOCK_OFF, Moves.PSYCHIC_FANGS, Moves.TRIPLE_AXEL ], + [Species.HISUI_ZORUA]: [ Moves.MOONBLAST, Moves.HYPER_VOICE, Moves.PARTING_SHOT, Moves.BLOOD_MOON ], + [Species.SPRIGATITO]: [ Moves.FIRE_LASH, Moves.TRIPLE_AXEL, Moves.SUCKER_PUNCH, Moves.WICKED_BLOW ], [Species.FUECOCO]: [ Moves.ALLURING_VOICE, Moves.SLACK_OFF, Moves.OVERDRIVE, Moves.MOONGEIST_BEAM ], [Species.QUAXLY]: [ Moves.DRAGON_DANCE, Moves.TRIPLE_AXEL, Moves.POWER_TRIP, Moves.THUNDEROUS_KICK ], [Species.LECHONK]: [ Moves.MILK_DRINK, Moves.PSYSHIELD_BASH, Moves.FILLET_AWAY, Moves.MULTI_ATTACK ], [Species.TAROUNTULA]: [ Moves.STONE_AXE, Moves.LEECH_LIFE, Moves.THIEF, Moves.SPORE ], [Species.NYMBLE]: [ Moves.KNOCK_OFF, Moves.FELL_STINGER, Moves.ATTACK_ORDER, Moves.WICKED_BLOW ], - [Species.PAWMI]: [ Moves.DRAIN_PUNCH, Moves.ICE_PUNCH, Moves.MACH_PUNCH, Moves.PLASMA_FISTS ], - [Species.TANDEMAUS]: [ Moves.BATON_PASS, Moves.THIEF, Moves.SIZZLY_SLIDE, Moves.REVIVAL_BLESSING ], + [Species.PAWMI]: [ Moves.DRAIN_PUNCH, Moves.METEOR_MASH, Moves.JET_PUNCH, Moves.PLASMA_FISTS ], + [Species.TANDEMAUS]: [ Moves.BATON_PASS, Moves.COVET, Moves.SIZZLY_SLIDE, Moves.REVIVAL_BLESSING ], [Species.FIDOUGH]: [ Moves.SOFT_BOILED, Moves.HIGH_HORSEPOWER, Moves.SIZZLY_SLIDE, Moves.TIDY_UP ], [Species.SMOLIV]: [ Moves.STRENGTH_SAP, Moves.EARTH_POWER, Moves.CALM_MIND, Moves.BOOMBURST ], [Species.SQUAWKABILLY]: [ Moves.PARTING_SHOT, Moves.EARTHQUAKE, Moves.FLARE_BLITZ, Moves.EXTREME_SPEED ], @@ -497,24 +530,24 @@ export const speciesEggMoves = { [Species.CAPSAKID]: [ Moves.STRENGTH_SAP, Moves.APPLE_ACID, Moves.FROST_BREATH, Moves.TORCH_SONG ], [Species.RELLOR]: [ Moves.HEAL_BLOCK, Moves.RECOVER, Moves.HEAT_WAVE, Moves.LUMINA_CRASH ], [Species.FLITTLE]: [ Moves.COSMIC_POWER, Moves.AURA_SPHERE, Moves.ROOST, Moves.FIERY_DANCE ], - [Species.TINKATINK]: [ Moves.MAGICAL_TORQUE, Moves.PYRO_BALL, Moves.ICE_HAMMER, Moves.SHIFT_GEAR ], + [Species.TINKATINK]: [ Moves.MAGICAL_TORQUE, Moves.PYRO_BALL, Moves.IVY_CUDGEL, Moves.SHIFT_GEAR ], [Species.WIGLETT]: [ Moves.SHELL_SMASH, Moves.ICICLE_CRASH, Moves.SEED_BOMB, Moves.SURGING_STRIKES ], [Species.BOMBIRDIER]: [ Moves.FLOATY_FALL, Moves.SWORDS_DANCE, Moves.SUCKER_PUNCH, Moves.MIGHTY_CLEAVE ], [Species.FINIZEN]: [ Moves.TRIPLE_AXEL, Moves.DRAIN_PUNCH, Moves.HEADLONG_RUSH, Moves.SURGING_STRIKES ], [Species.VAROOM]: [ Moves.COMBAT_TORQUE, Moves.U_TURN, Moves.BLAZING_TORQUE, Moves.NOXIOUS_TORQUE ], - [Species.CYCLIZAR]: [ Moves.BATON_PASS, Moves.BLAZING_TORQUE, Moves.KNOCK_OFF, Moves.CLANGOROUS_SOUL ], + [Species.CYCLIZAR]: [ Moves.PARTING_SHOT, Moves.FIRE_LASH, Moves.MAGICAL_TORQUE, Moves.GLAIVE_RUSH ], [Species.ORTHWORM]: [ Moves.SIZZLY_SLIDE, Moves.COIL, Moves.BODY_PRESS, Moves.SHORE_UP ], [Species.GLIMMET]: [ Moves.CALM_MIND, Moves.EARTH_POWER, Moves.FIERY_DANCE, Moves.MALIGNANT_CHAIN ], [Species.GREAVARD]: [ Moves.SHADOW_BONE, Moves.YAWN, Moves.SHORE_UP, Moves.COLLISION_COURSE ], [Species.FLAMIGO]: [ Moves.THUNDEROUS_KICK, Moves.TRIPLE_AXEL, Moves.FLOATY_FALL, Moves.VICTORY_DANCE ], - [Species.CETODDLE]: [ Moves.MOUNTAIN_GALE, Moves.HIGH_HORSEPOWER, Moves.RECOVER, Moves.DRAGON_DANCE ], + [Species.CETODDLE]: [ Moves.MOUNTAIN_GALE, Moves.HIGH_HORSEPOWER, Moves.SLACK_OFF, Moves.DRAGON_DANCE ], [Species.VELUZA]: [ Moves.PSYBLADE, Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.BITTER_BLADE ], - [Species.DONDOZO]: [ Moves.SOFT_BOILED, Moves.SIZZLY_SLIDE, Moves.TOXIC, Moves.SALT_CURE ], - [Species.TATSUGIRI]: [ Moves.ICE_BEAM, Moves.FILLET_AWAY, Moves.CORE_ENFORCER, Moves.STEAM_ERUPTION ], + [Species.DONDOZO]: [ Moves.SOFT_BOILED, Moves.SIZZLY_SLIDE, Moves.BREAKING_SWIPE, Moves.SALT_CURE ], + [Species.TATSUGIRI]: [ Moves.SLUDGE_BOMB, Moves.FILLET_AWAY, Moves.CORE_ENFORCER, Moves.STEAM_ERUPTION ], [Species.GREAT_TUSK]: [ Moves.STONE_AXE, Moves.MORNING_SUN, Moves.COLLISION_COURSE, Moves.SHIFT_GEAR ], [Species.SCREAM_TAIL]: [ Moves.TORCH_SONG, Moves.GLITZY_GLOW, Moves.MOONLIGHT, Moves.SPARKLY_SWIRL ], [Species.BRUTE_BONNET]: [ Moves.SAPPY_SEED, Moves.STRENGTH_SAP, Moves.EARTHQUAKE, Moves.WICKED_BLOW ], - [Species.FLUTTER_MANE]: [ Moves.MOONLIGHT, Moves.FLAMETHROWER, Moves.EARTH_POWER, Moves.ASTRAL_BARRAGE ], + [Species.FLUTTER_MANE]: [ Moves.MOONLIGHT, Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.MOONGEIST_BEAM ], [Species.SLITHER_WING]: [ Moves.MIGHTY_CLEAVE, Moves.THUNDEROUS_KICK, Moves.FIRE_LASH, Moves.VICTORY_DANCE ], [Species.SANDY_SHOCKS]: [ Moves.MORNING_SUN, Moves.ICE_BEAM, Moves.NASTY_PLOT, Moves.THUNDERCLAP ], [Species.IRON_TREADS]: [ Moves.FUSION_BOLT, Moves.BULK_UP, Moves.SHORE_UP, Moves.SUNSTEEL_STRIKE ], @@ -523,57 +556,32 @@ export const speciesEggMoves = { [Species.IRON_JUGULIS]: [ Moves.FIERY_WRATH, Moves.ROOST, Moves.NASTY_PLOT, Moves.OBLIVION_WING ], [Species.IRON_MOTH]: [ Moves.EARTH_POWER, Moves.SEARING_SHOT, Moves.MALIGNANT_CHAIN, Moves.QUIVER_DANCE ], [Species.IRON_THORNS]: [ Moves.DIAMOND_STORM, Moves.SHORE_UP, Moves.SHIFT_GEAR, Moves.PLASMA_FISTS ], - [Species.FRIGIBAX]: [ Moves.DRAGON_DARTS, Moves.DRAGON_DANCE, Moves.EARTHQUAKE, Moves.GLACIAL_LANCE ], + [Species.FRIGIBAX]: [ Moves.BEHEMOTH_BLADE, Moves.DRAGON_DANCE, Moves.MOUNTAIN_GALE, Moves.PRECIPICE_BLADES ], [Species.GIMMIGHOUL]: [ Moves.HAPPY_HOUR, Moves.AURA_SPHERE, Moves.SURF, Moves.ASTRAL_BARRAGE ], [Species.WO_CHIEN]: [ Moves.SPORE, Moves.FIERY_WRATH, Moves.SAPPY_SEED, Moves.STRENGTH_SAP ], - [Species.CHIEN_PAO]: [ Moves.KNOCK_OFF, Moves.PARTING_SHOT, Moves.BITTER_BLADE, Moves.GLACIAL_LANCE ], - [Species.TING_LU]: [ Moves.SHORE_UP, Moves.WICKED_BLOW, Moves.SAPPY_SEED, Moves.THOUSAND_ARROWS ], + [Species.CHIEN_PAO]: [ Moves.KNOCK_OFF, Moves.PARTING_SHOT, Moves.TRIPLE_AXEL, Moves.BITTER_BLADE ], + [Species.TING_LU]: [ Moves.SHORE_UP, Moves.CEASELESS_EDGE, Moves.SAPPY_SEED, Moves.PRECIPICE_BLADES ], [Species.CHI_YU]: [ Moves.FIERY_WRATH, Moves.HYDRO_STEAM, Moves.MORNING_SUN, Moves.BLUE_FLARE ], [Species.ROARING_MOON]: [ Moves.FIRE_LASH, Moves.DRAGON_HAMMER, Moves.SUCKER_PUNCH, Moves.WICKED_BLOW ], [Species.IRON_VALIANT]: [ Moves.PLASMA_FISTS, Moves.NO_RETREAT, Moves.SECRET_SWORD, Moves.MAGICAL_TORQUE ], - [Species.KORAIDON]: [ Moves.SUNSTEEL_STRIKE, Moves.MORNING_SUN, Moves.DRAGON_DARTS, Moves.BITTER_BLADE ], + [Species.KORAIDON]: [ Moves.SUNSTEEL_STRIKE, Moves.SOLAR_BLADE, Moves.DRAGON_DARTS, Moves.BITTER_BLADE ], [Species.MIRAIDON]: [ Moves.ICE_BEAM, Moves.CLANGOROUS_SOUL, Moves.CORE_ENFORCER, Moves.RISING_VOLTAGE ], - [Species.WALKING_WAKE]: [ Moves.CORE_ENFORCER, Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.BOUNCY_BUBBLE ], + [Species.WALKING_WAKE]: [ Moves.BOUNCY_BUBBLE, Moves.NASTY_PLOT, Moves.SLUDGE_WAVE, Moves.CORE_ENFORCER ], [Species.IRON_LEAVES]: [ Moves.BITTER_BLADE, Moves.U_TURN, Moves.MIGHTY_CLEAVE, Moves.VICTORY_DANCE ], - [Species.POLTCHAGEIST]: [ Moves.SHELL_SMASH, Moves.BOUNCY_BUBBLE, Moves.LEECH_SEED, Moves.SPARKLY_SWIRL ], - [Species.OKIDOGI]: [ Moves.DRAIN_PUNCH, Moves.KNOCK_OFF, Moves.DIRE_CLAW, Moves.VICTORY_DANCE ], + [Species.POLTCHAGEIST]: [ Moves.PARABOLIC_CHARGE, Moves.BOUNCY_BUBBLE, Moves.LEECH_SEED, Moves.SPARKLY_SWIRL ], + [Species.OKIDOGI]: [ Moves.COMBAT_TORQUE, Moves.TIDY_UP, Moves.DIRE_CLAW, Moves.WICKED_BLOW ], [Species.MUNKIDORI]: [ Moves.PSYSTRIKE, Moves.HEAT_WAVE, Moves.EARTH_POWER, Moves.MALIGNANT_CHAIN ], - [Species.FEZANDIPITI]: [ Moves.BARB_BARRAGE, Moves.VICTORY_DANCE, Moves.TRIPLE_AXEL, Moves.MAGICAL_TORQUE ], - [Species.OGERPON]: [ Moves.FLOWER_TRICK, Moves.BONEMERANG, Moves.TRIPLE_AXEL, Moves.GIGATON_HAMMER ], + [Species.FEZANDIPITI]: [ Moves.BARB_BARRAGE, Moves.BONEMERANG, Moves.TRIPLE_AXEL, Moves.VICTORY_DANCE ], + [Species.OGERPON]: [ Moves.SLEEP_POWDER, Moves.BONEMERANG, Moves.TRIPLE_AXEL, Moves.FLOWER_TRICK ], [Species.GOUGING_FIRE]: [ Moves.EXTREME_SPEED, Moves.BULK_UP, Moves.SACRED_FIRE, Moves.GLAIVE_RUSH ], [Species.RAGING_BOLT]: [ Moves.NASTY_PLOT, Moves.FLAMETHROWER, Moves.MORNING_SUN, Moves.ELECTRO_DRIFT ], [Species.IRON_BOULDER]: [ Moves.PSYBLADE, Moves.KOWTOW_CLEAVE, Moves.STONE_AXE, Moves.BITTER_BLADE ], [Species.IRON_CROWN]: [ Moves.NASTY_PLOT, Moves.SECRET_SWORD, Moves.PSYSTRIKE, Moves.ELECTRO_DRIFT ], [Species.TERAPAGOS]: [ Moves.MOONBLAST, Moves.RECOVER, Moves.ICE_BEAM, Moves.SHELL_SMASH ], [Species.PECHARUNT]: [ Moves.TAKE_HEART, Moves.BODY_PRESS, Moves.SAPPY_SEED, Moves.KINGS_SHIELD ], - [Species.ALOLA_RATTATA]: [ Moves.FALSE_SURRENDER, Moves.PSYCHIC_FANGS, Moves.COIL, Moves.EXTREME_SPEED ], - [Species.ALOLA_SANDSHREW]: [ Moves.SPIKY_SHIELD, Moves.AQUA_CUTTER, Moves.SHIFT_GEAR, Moves.GLACIAL_LANCE ], - [Species.ALOLA_VULPIX]: [ Moves.MOONBLAST, Moves.PARTING_SHOT, Moves.FLAMETHROWER, Moves.REVIVAL_BLESSING ], - [Species.ALOLA_DIGLETT]: [ Moves.THOUSAND_WAVES, Moves.SWORDS_DANCE, Moves.TRIPLE_DIVE, Moves.MOUNTAIN_GALE ], - [Species.ALOLA_MEOWTH]: [ Moves.BADDY_BAD, Moves.BUZZY_BUZZ, Moves.PARTING_SHOT, Moves.MAKE_IT_RAIN ], - [Species.ALOLA_GEODUDE]: [ Moves.THOUSAND_WAVES, Moves.BULK_UP, Moves.STONE_AXE, Moves.EXTREME_SPEED ], - [Species.ALOLA_GRIMER]: [ Moves.SUCKER_PUNCH, Moves.BARB_BARRAGE, Moves.STRENGTH_SAP, Moves.SURGING_STRIKES ], - [Species.ETERNAL_FLOETTE]: [ Moves.MIND_BLOWN, Moves.CHLOROBLAST, Moves.PHOTON_GEYSER, Moves.QUIVER_DANCE ], - [Species.GALAR_MEOWTH]: [ Moves.AQUA_CUTTER, Moves.KNOCK_OFF, Moves.BULLET_PUNCH, Moves.BEHEMOTH_BASH ], - [Species.GALAR_PONYTA]: [ Moves.MAGICAL_TORQUE, Moves.EXTREME_SPEED, Moves.FLARE_BLITZ, Moves.PHOTON_GEYSER ], - [Species.GALAR_SLOWPOKE]: [ Moves.TRICK_ROOM, Moves.BADDY_BAD, Moves.MOONBLAST, Moves.TORCH_SONG ], - [Species.GALAR_FARFETCHD]: [ Moves.ROOST, Moves.SACRED_SWORD, Moves.KINGS_SHIELD, Moves.BEHEMOTH_BLADE ], - [Species.GALAR_ARTICUNO]: [ Moves.SECRET_SWORD, Moves.NIGHT_DAZE, Moves.ICE_BEAM, Moves.OBLIVION_WING ], - [Species.GALAR_ZAPDOS]: [ Moves.TIDY_UP, Moves.FLOATY_FALL, Moves.ROOST, Moves.BOLT_BEAK ], - [Species.GALAR_MOLTRES]: [ Moves.ROOST, Moves.SLUDGE_BOMB, Moves.FLAMETHROWER, Moves.OBLIVION_WING ], - [Species.GALAR_CORSOLA]: [ Moves.SHELL_SMASH, Moves.AURA_SPHERE, Moves.INFERNAL_PARADE, Moves.ASTRAL_BARRAGE ], - [Species.GALAR_ZIGZAGOON]: [ Moves.CEASELESS_EDGE, Moves.FACADE, Moves.PARTING_SHOT, Moves.EXTREME_SPEED ], - [Species.GALAR_DARUMAKA]: [ Moves.ICE_SPINNER, Moves.ENDURE, Moves.DRAIN_PUNCH, Moves.V_CREATE ], - [Species.GALAR_YAMASK]: [ Moves.STRENGTH_SAP, Moves.DIRE_CLAW, Moves.THOUSAND_WAVES, Moves.SPECTRAL_THIEF ], - [Species.GALAR_STUNFISK]: [ Moves.SPIKY_SHIELD, Moves.THOUSAND_ARROWS, Moves.STRENGTH_SAP, Moves.DOUBLE_IRON_BASH ], - [Species.HISUI_GROWLITHE]: [ Moves.WAVE_CRASH, Moves.HEAD_SMASH, Moves.VOLT_TACKLE, Moves.DRAGON_DANCE ], - [Species.HISUI_VOLTORB]: [ Moves.FROST_BREATH, Moves.NASTY_PLOT, Moves.APPLE_ACID, Moves.ELECTRO_DRIFT ], - [Species.HISUI_QWILFISH]: [ Moves.CEASELESS_EDGE, Moves.KNOCK_OFF, Moves.STRENGTH_SAP, Moves.FISHIOUS_REND ], - [Species.HISUI_SNEASEL]: [ Moves.THUNDEROUS_KICK, Moves.KNOCK_OFF, Moves.TRIPLE_AXEL, Moves.VICTORY_DANCE ], - [Species.HISUI_ZORUA]: [ Moves.MOONBLAST, Moves.HYPER_VOICE, Moves.PARTING_SHOT, Moves.BLOOD_MOON ], [Species.PALDEA_TAUROS]: [ Moves.NO_RETREAT, Moves.BLAZING_TORQUE, Moves.AQUA_STEP, Moves.THUNDEROUS_KICK ], - [Species.PALDEA_WOOPER]: [ Moves.RECOVER, Moves.STONE_AXE, Moves.BANEFUL_BUNKER, Moves.SAPPY_SEED ], - [Species.BLOODMOON_URSALUNA]: [ Moves.NASTY_PLOT, Moves.TRICK_ROOM, Moves.THUNDERBOLT, Moves.BOOMBURST ] + [Species.PALDEA_WOOPER]: [ Moves.STONE_AXE, Moves.RECOVER, Moves.BANEFUL_BUNKER, Moves.BARB_BARRAGE ], + [Species.BLOODMOON_URSALUNA]: [ Moves.NASTY_PLOT, Moves.ROCK_POLISH, Moves.SANDSEAR_STORM, Moves.BOOMBURST ] }; function parseEggMoves(content: string): void { diff --git a/src/data/balance/passives.ts b/src/data/balance/passives.ts index 6fb0e80e085..3a8285b4586 100644 --- a/src/data/balance/passives.ts +++ b/src/data/balance/passives.ts @@ -23,9 +23,9 @@ export const starterPassiveAbilities = { [Species.MEOWTH]: Abilities.TOUGH_CLAWS, [Species.PSYDUCK]: Abilities.SIMPLE, [Species.MANKEY]: Abilities.IRON_FIST, - [Species.GROWLITHE]: Abilities.SPEED_BOOST, + [Species.GROWLITHE]: Abilities.FLUFFY, [Species.POLIWAG]: Abilities.NO_GUARD, - [Species.ABRA]: Abilities.PSYCHIC_SURGE, + [Species.ABRA]: Abilities.MAGICIAN, [Species.MACHOP]: Abilities.QUICK_FEET, [Species.BELLSPROUT]: Abilities.FLOWER_GIFT, [Species.TENTACOOL]: Abilities.TOXIC_CHAIN, @@ -41,7 +41,7 @@ export const starterPassiveAbilities = { [Species.GASTLY]: Abilities.SHADOW_SHIELD, [Species.ONIX]: Abilities.ROCKY_PAYLOAD, [Species.DROWZEE]: Abilities.MAGICIAN, - [Species.KRABBY]: Abilities.THERMAL_EXCHANGE, + [Species.KRABBY]: Abilities.UNBURDEN, [Species.VOLTORB]: Abilities.TRANSISTOR, [Species.EXEGGCUTE]: Abilities.RIPEN, [Species.CUBONE]: Abilities.PARENTAL_BOND, @@ -70,6 +70,7 @@ export const starterPassiveAbilities = { [Species.DRATINI]: Abilities.AERILATE, [Species.MEWTWO]: Abilities.NEUROFORCE, [Species.MEW]: Abilities.PROTEAN, + [Species.CHIKORITA]: Abilities.THICK_FAT, [Species.CYNDAQUIL]: Abilities.DROUGHT, [Species.TOTODILE]: Abilities.TOUGH_CLAWS, @@ -77,12 +78,12 @@ export const starterPassiveAbilities = { [Species.HOOTHOOT]: Abilities.AERILATE, [Species.LEDYBA]: Abilities.PRANKSTER, [Species.SPINARAK]: Abilities.PRANKSTER, - [Species.CHINCHOU]: Abilities.WATER_BUBBLE, + [Species.CHINCHOU]: Abilities.REGENERATOR, [Species.PICHU]: Abilities.ELECTRIC_SURGE, [Species.CLEFFA]: Abilities.ANALYTIC, [Species.IGGLYBUFF]: Abilities.HUGE_POWER, [Species.TOGEPI]: Abilities.PIXILATE, - [Species.NATU]: Abilities.TINTED_LENS, + [Species.NATU]: Abilities.SHEER_FORCE, [Species.MAREEP]: Abilities.ELECTROMORPHOSIS, [Species.HOPPIP]: Abilities.FLUFFY, [Species.AIPOM]: Abilities.SCRAPPY, @@ -108,24 +109,25 @@ export const starterPassiveAbilities = { [Species.REMORAID]: Abilities.SIMPLE, [Species.DELIBIRD]: Abilities.HUGE_POWER, [Species.SKARMORY]: Abilities.LIGHTNING_ROD, - [Species.HOUNDOUR]: Abilities.DROUGHT, + [Species.HOUNDOUR]: Abilities.LIGHTNING_ROD, [Species.PHANPY]: Abilities.SPEED_BOOST, [Species.STANTLER]: Abilities.SPEED_BOOST, [Species.SMEARGLE]: Abilities.PRANKSTER, [Species.TYROGUE]: Abilities.MOXIE, [Species.SMOOCHUM]: Abilities.PSYCHIC_SURGE, [Species.ELEKID]: Abilities.SHEER_FORCE, - [Species.MAGBY]: Abilities.CONTRARY, + [Species.MAGBY]: Abilities.SHEER_FORCE, [Species.MILTANK]: Abilities.STAMINA, - [Species.RAIKOU]: Abilities.TRANSISTOR, - [Species.ENTEI]: Abilities.MOXIE, - [Species.SUICUNE]: Abilities.UNAWARE, + [Species.RAIKOU]: Abilities.BEAST_BOOST, + [Species.ENTEI]: Abilities.BEAST_BOOST, + [Species.SUICUNE]: Abilities.BEAST_BOOST, [Species.LARVITAR]: Abilities.SAND_RUSH, [Species.LUGIA]: Abilities.DELTA_STREAM, [Species.HO_OH]: Abilities.MAGIC_GUARD, [Species.CELEBI]: Abilities.PSYCHIC_SURGE, + [Species.TREECKO]: Abilities.TINTED_LENS, - [Species.TORCHIC]: Abilities.RECKLESS, + [Species.TORCHIC]: Abilities.DEFIANT, [Species.MUDKIP]: Abilities.DRIZZLE, [Species.POOCHYENA]: Abilities.TOUGH_CLAWS, [Species.ZIGZAGOON]: Abilities.RUN_AWAY, @@ -148,7 +150,7 @@ export const starterPassiveAbilities = { [Species.MAWILE]: Abilities.UNNERVE, [Species.ARON]: Abilities.EARTH_EATER, [Species.MEDITITE]: Abilities.MINDS_EYE, - [Species.ELECTRIKE]: Abilities.ELECTRIC_SURGE, + [Species.ELECTRIKE]: Abilities.FLASH_FIRE, [Species.PLUSLE]: Abilities.POWER_SPOT, [Species.MINUN]: Abilities.POWER_SPOT, [Species.VOLBEAT]: Abilities.HONEY_GATHER, @@ -162,7 +164,7 @@ export const starterPassiveAbilities = { [Species.SPINDA]: Abilities.SIMPLE, [Species.TRAPINCH]: Abilities.ADAPTABILITY, [Species.CACNEA]: Abilities.SAND_RUSH, - [Species.SWABLU]: Abilities.ADAPTABILITY, + [Species.SWABLU]: Abilities.FLUFFY, [Species.ZANGOOSE]: Abilities.POISON_HEAL, [Species.SEVIPER]: Abilities.MULTISCALE, [Species.LUNATONE]: Abilities.SHADOW_SHIELD, @@ -182,14 +184,14 @@ export const starterPassiveAbilities = { [Species.WYNAUT]: Abilities.STURDY, [Species.SNORUNT]: Abilities.SNOW_WARNING, [Species.SPHEAL]: Abilities.UNAWARE, - [Species.CLAMPERL]: Abilities.DRIZZLE, + [Species.CLAMPERL]: Abilities.ARENA_TRAP, [Species.RELICANTH]: Abilities.PRIMORDIAL_SEA, [Species.LUVDISC]: Abilities.MULTISCALE, - [Species.BAGON]: Abilities.DRAGONS_MAW, + [Species.BAGON]: Abilities.MOLD_BREAKER, [Species.BELDUM]: Abilities.LEVITATE, [Species.REGIROCK]: Abilities.SAND_STREAM, [Species.REGICE]: Abilities.SNOW_WARNING, - [Species.REGISTEEL]: Abilities.FILTER, + [Species.REGISTEEL]: Abilities.STEELY_SPIRIT, [Species.LATIAS]: Abilities.PRISM_ARMOR, [Species.LATIOS]: Abilities.TINTED_LENS, [Species.KYOGRE]: Abilities.MOLD_BREAKER, @@ -197,6 +199,7 @@ export const starterPassiveAbilities = { [Species.RAYQUAZA]: Abilities.UNNERVE, [Species.JIRACHI]: Abilities.COMATOSE, [Species.DEOXYS]: Abilities.PROTEAN, + [Species.TURTWIG]: Abilities.THICK_FAT, [Species.CHIMCHAR]: Abilities.BEAST_BOOST, [Species.PIPLUP]: Abilities.DRIZZLE, @@ -218,9 +221,9 @@ export const starterPassiveAbilities = { [Species.GLAMEOW]: Abilities.INTIMIDATE, [Species.CHINGLING]: Abilities.PUNK_ROCK, [Species.STUNKY]: Abilities.NEUTRALIZING_GAS, - [Species.BRONZOR]: Abilities.BULLETPROOF, + [Species.BRONZOR]: Abilities.MIRROR_ARMOR, [Species.BONSLY]: Abilities.SAP_SIPPER, - [Species.MIME_JR]: Abilities.OPPORTUNIST, + [Species.MIME_JR]: Abilities.PRANKSTER, [Species.HAPPINY]: Abilities.FUR_COAT, [Species.CHATOT]: Abilities.PUNK_ROCK, [Species.SPIRITOMB]: Abilities.VESSEL_OF_RUIN, @@ -233,7 +236,7 @@ export const starterPassiveAbilities = { [Species.CARNIVINE]: Abilities.ARENA_TRAP, [Species.FINNEON]: Abilities.WATER_BUBBLE, [Species.MANTYKE]: Abilities.UNAWARE, - [Species.SNOVER]: Abilities.THICK_FAT, + [Species.SNOVER]: Abilities.GRASSY_SURGE, [Species.ROTOM]: Abilities.HADRON_ENGINE, [Species.UXIE]: Abilities.UNAWARE, [Species.MESPRIT]: Abilities.MOODY, @@ -249,6 +252,7 @@ export const starterPassiveAbilities = { [Species.DARKRAI]: Abilities.UNNERVE, [Species.SHAYMIN]: Abilities.WIND_RIDER, [Species.ARCEUS]: Abilities.ADAPTABILITY, + [Species.VICTINI]: Abilities.SHEER_FORCE, [Species.SNIVY]: Abilities.MULTISCALE, [Species.TEPIG]: Abilities.ROCK_HEAD, @@ -264,7 +268,7 @@ export const starterPassiveAbilities = { [Species.BLITZLE]: Abilities.ELECTRIC_SURGE, [Species.ROGGENROLA]: Abilities.SOLID_ROCK, [Species.WOOBAT]: Abilities.OPPORTUNIST, - [Species.DRILBUR]: Abilities.SAND_STREAM, + [Species.DRILBUR]: Abilities.STURDY, [Species.AUDINO]: Abilities.FRIEND_GUARD, [Species.TIMBURR]: Abilities.ROCKY_PAYLOAD, [Species.TYMPOLE]: Abilities.POISON_HEAL, @@ -292,7 +296,7 @@ export const starterPassiveAbilities = { [Species.DUCKLETT]: Abilities.DRIZZLE, [Species.VANILLITE]: Abilities.SLUSH_RUSH, [Species.DEERLING]: Abilities.FUR_COAT, - [Species.EMOLGA]: Abilities.TRANSISTOR, + [Species.EMOLGA]: Abilities.SERENE_GRACE, [Species.KARRABLAST]: Abilities.QUICK_DRAW, [Species.FOONGUS]: Abilities.THICK_FAT, [Species.FRILLISH]: Abilities.POISON_HEAL, @@ -301,10 +305,10 @@ export const starterPassiveAbilities = { [Species.FERROSEED]: Abilities.ROUGH_SKIN, [Species.KLINK]: Abilities.STEELY_SPIRIT, [Species.TYNAMO]: Abilities.POISON_HEAL, - [Species.ELGYEM]: Abilities.PRISM_ARMOR, - [Species.LITWICK]: Abilities.SOUL_HEART, + [Species.ELGYEM]: Abilities.BEADS_OF_RUIN, + [Species.LITWICK]: Abilities.SHADOW_TAG, [Species.AXEW]: Abilities.DRAGONS_MAW, - [Species.CUBCHOO]: Abilities.TOUGH_CLAWS, + [Species.CUBCHOO]: Abilities.FUR_COAT, [Species.CRYOGONAL]: Abilities.SNOW_WARNING, [Species.SHELMET]: Abilities.PROTEAN, [Species.STUNFISK]: Abilities.STORM_DRAIN, @@ -331,6 +335,7 @@ export const starterPassiveAbilities = { [Species.KELDEO]: Abilities.GRIM_NEIGH, [Species.MELOETTA]: Abilities.MINDS_EYE, [Species.GENESECT]: Abilities.PROTEAN, + [Species.CHESPIN]: Abilities.DAUNTLESS_SHIELD, [Species.FENNEKIN]: Abilities.PSYCHIC_SURGE, [Species.FROAKIE]: Abilities.STAKEOUT, @@ -345,11 +350,11 @@ export const starterPassiveAbilities = { [Species.ESPURR]: Abilities.FUR_COAT, [Species.HONEDGE]: Abilities.SHARPNESS, [Species.SPRITZEE]: Abilities.FUR_COAT, - [Species.SWIRLIX]: Abilities.WELL_BAKED_BODY, + [Species.SWIRLIX]: Abilities.RIPEN, [Species.INKAY]: Abilities.UNNERVE, [Species.BINACLE]: Abilities.SAP_SIPPER, [Species.SKRELP]: Abilities.DRAGONS_MAW, - [Species.CLAUNCHER]: Abilities.SWIFT_SWIM, + [Species.CLAUNCHER]: Abilities.PROTEAN, [Species.HELIOPTILE]: Abilities.PROTEAN, [Species.TYRUNT]: Abilities.RECKLESS, [Species.AMAURA]: Abilities.ICE_SCALES, @@ -364,10 +369,12 @@ export const starterPassiveAbilities = { [Species.NOIBAT]: Abilities.PUNK_ROCK, [Species.XERNEAS]: Abilities.HARVEST, [Species.YVELTAL]: Abilities.SOUL_HEART, - [Species.ZYGARDE]: Abilities.HUGE_POWER, - [Species.DIANCIE]: Abilities.LEVITATE, + [Species.ZYGARDE]: Abilities.ADAPTABILITY, + [Species.DIANCIE]: Abilities.PRISM_ARMOR, [Species.HOOPA]: Abilities.OPPORTUNIST, [Species.VOLCANION]: Abilities.FILTER, + [Species.ETERNAL_FLOETTE]: Abilities.MAGIC_GUARD, + [Species.ROWLET]: Abilities.SNIPER, [Species.LITTEN]: Abilities.OPPORTUNIST, [Species.POPPLIO]: Abilities.PUNK_ROCK, @@ -403,7 +410,7 @@ export const starterPassiveAbilities = { [Species.DRAMPA]: Abilities.THICK_FAT, [Species.DHELMISE]: Abilities.WATER_BUBBLE, [Species.JANGMO_O]: Abilities.DAUNTLESS_SHIELD, - [Species.TAPU_KOKO]: Abilities.TRANSISTOR, + [Species.TAPU_KOKO]: Abilities.DAUNTLESS_SHIELD, [Species.TAPU_LELE]: Abilities.SHEER_FORCE, [Species.TAPU_BULU]: Abilities.TRIAGE, [Species.TAPU_FINI]: Abilities.FAIRY_AURA, @@ -413,16 +420,24 @@ export const starterPassiveAbilities = { [Species.PHEROMOSA]: Abilities.TINTED_LENS, [Species.XURKITREE]: Abilities.TRANSISTOR, [Species.CELESTEELA]: Abilities.HEATPROOF, - [Species.KARTANA]: Abilities.SHARPNESS, + [Species.KARTANA]: Abilities.LONG_REACH, [Species.GUZZLORD]: Abilities.POISON_HEAL, [Species.NECROZMA]: Abilities.BEAST_BOOST, [Species.MAGEARNA]: Abilities.STEELY_SPIRIT, [Species.MARSHADOW]: Abilities.IRON_FIST, - [Species.POIPOLE]: Abilities.SHEER_FORCE, + [Species.POIPOLE]: Abilities.LEVITATE, [Species.STAKATAKA]: Abilities.SOLID_ROCK, [Species.BLACEPHALON]: Abilities.MAGIC_GUARD, [Species.ZERAORA]: Abilities.TOUGH_CLAWS, - [Species.MELTAN]: Abilities.STEELY_SPIRIT, + [Species.MELTAN]: Abilities.HEATPROOF, + [Species.ALOLA_RATTATA]: Abilities.ADAPTABILITY, + [Species.ALOLA_SANDSHREW]: Abilities.ICE_SCALES, + [Species.ALOLA_VULPIX]: Abilities.SHEER_FORCE, + [Species.ALOLA_DIGLETT]: Abilities.STURDY, + [Species.ALOLA_MEOWTH]: Abilities.DARK_AURA, + [Species.ALOLA_GEODUDE]: Abilities.DRY_SKIN, + [Species.ALOLA_GRIMER]: Abilities.TOXIC_DEBRIS, + [Species.GROOKEY]: Abilities.GRASS_PELT, [Species.SCORBUNNY]: Abilities.NO_GUARD, [Species.SOBBLE]: Abilities.SUPER_LUCK, @@ -431,7 +446,7 @@ export const starterPassiveAbilities = { [Species.BLIPBUG]: Abilities.PSYCHIC_SURGE, [Species.NICKIT]: Abilities.MAGICIAN, [Species.GOSSIFLEUR]: Abilities.GRASSY_SURGE, - [Species.WOOLOO]: Abilities.SIMPLE, + [Species.WOOLOO]: Abilities.SCRAPPY, [Species.CHEWTLE]: Abilities.ROCKY_PAYLOAD, [Species.YAMPER]: Abilities.SHEER_FORCE, [Species.ROLYCOLY]: Abilities.SOLID_ROCK, @@ -444,7 +459,7 @@ export const starterPassiveAbilities = { [Species.CLOBBOPUS]: Abilities.WATER_BUBBLE, [Species.SINISTEA]: Abilities.SHADOW_SHIELD, [Species.HATENNA]: Abilities.FAIRY_AURA, - [Species.IMPIDIMP]: Abilities.FUR_COAT, + [Species.IMPIDIMP]: Abilities.INTIMIDATE, [Species.MILCERY]: Abilities.REGENERATOR, [Species.FALINKS]: Abilities.PARENTAL_BOND, [Species.PINCURCHIN]: Abilities.ELECTROMORPHOSIS, @@ -455,7 +470,7 @@ export const starterPassiveAbilities = { [Species.MORPEKO]: Abilities.MOODY, [Species.CUFANT]: Abilities.EARTH_EATER, [Species.DRACOZOLT]: Abilities.NO_GUARD, - [Species.ARCTOZOLT]: Abilities.TRANSISTOR, + [Species.ARCTOZOLT]: Abilities.WATER_ABSORB, [Species.DRACOVISH]: Abilities.SWIFT_SWIM, [Species.ARCTOVISH]: Abilities.STRONG_JAW, [Species.DURALUDON]: Abilities.STEELWORKER, @@ -471,6 +486,24 @@ export const starterPassiveAbilities = { [Species.SPECTRIER]: Abilities.SHADOW_SHIELD, [Species.CALYREX]: Abilities.HARVEST, [Species.ENAMORUS]: Abilities.FAIRY_AURA, + [Species.GALAR_MEOWTH]: Abilities.UNBURDEN, + [Species.GALAR_PONYTA]: Abilities.CHILLING_NEIGH, + [Species.GALAR_SLOWPOKE]: Abilities.UNAWARE, + [Species.GALAR_FARFETCHD]: Abilities.INTREPID_SWORD, + [Species.GALAR_ARTICUNO]: Abilities.SERENE_GRACE, + [Species.GALAR_ZAPDOS]: Abilities.TOUGH_CLAWS, + [Species.GALAR_MOLTRES]: Abilities.DARK_AURA, + [Species.GALAR_CORSOLA]: Abilities.SHADOW_SHIELD, + [Species.GALAR_ZIGZAGOON]: Abilities.POISON_HEAL, + [Species.GALAR_DARUMAKA]: Abilities.FLASH_FIRE, + [Species.GALAR_YAMASK]: Abilities.TABLETS_OF_RUIN, + [Species.GALAR_STUNFISK]: Abilities.ARENA_TRAP, + [Species.HISUI_GROWLITHE]: Abilities.RECKLESS, + [Species.HISUI_VOLTORB]: Abilities.TRANSISTOR, + [Species.HISUI_QWILFISH]: Abilities.MERCILESS, + [Species.HISUI_SNEASEL]: Abilities.SCRAPPY, + [Species.HISUI_ZORUA]: Abilities.ADAPTABILITY, + [Species.SPRIGATITO]: Abilities.MAGICIAN, [Species.FUECOCO]: Abilities.PUNK_ROCK, [Species.QUAXLY]: Abilities.OPPORTUNIST, @@ -502,40 +535,40 @@ export const starterPassiveAbilities = { [Species.CYCLIZAR]: Abilities.PROTEAN, [Species.ORTHWORM]: Abilities.REGENERATOR, [Species.GLIMMET]: Abilities.LEVITATE, - [Species.GREAVARD]: Abilities.FUR_COAT, + [Species.GREAVARD]: Abilities.UNAWARE, [Species.FLAMIGO]: Abilities.MOXIE, - [Species.CETODDLE]: Abilities.ICE_SCALES, + [Species.CETODDLE]: Abilities.REFRIGERATE, [Species.VELUZA]: Abilities.SUPER_LUCK, - [Species.DONDOZO]: Abilities.PARENTAL_BOND, - [Species.TATSUGIRI]: Abilities.ADAPTABILITY, + [Species.DONDOZO]: Abilities.DRAGONS_MAW, + [Species.TATSUGIRI]: Abilities.FLUFFY, [Species.GREAT_TUSK]: Abilities.INTIMIDATE, [Species.SCREAM_TAIL]: Abilities.UNAWARE, [Species.BRUTE_BONNET]: Abilities.CHLOROPHYLL, [Species.FLUTTER_MANE]: Abilities.DAZZLING, [Species.SLITHER_WING]: Abilities.SCRAPPY, - [Species.SANDY_SHOCKS]: Abilities.EARTH_EATER, + [Species.SANDY_SHOCKS]: Abilities.ELECTRIC_SURGE, [Species.IRON_TREADS]: Abilities.STEELY_SPIRIT, [Species.IRON_BUNDLE]: Abilities.SNOW_WARNING, [Species.IRON_HANDS]: Abilities.IRON_FIST, [Species.IRON_JUGULIS]: Abilities.LIGHTNING_ROD, [Species.IRON_MOTH]: Abilities.LEVITATE, [Species.IRON_THORNS]: Abilities.SAND_STREAM, - [Species.FRIGIBAX]: Abilities.SNOW_WARNING, + [Species.FRIGIBAX]: Abilities.INTIMIDATE, [Species.GIMMIGHOUL]: Abilities.HONEY_GATHER, [Species.WO_CHIEN]: Abilities.VESSEL_OF_RUIN, [Species.CHIEN_PAO]: Abilities.INTIMIDATE, [Species.TING_LU]: Abilities.STAMINA, [Species.CHI_YU]: Abilities.BERSERK, [Species.ROARING_MOON]: Abilities.TOUGH_CLAWS, - [Species.IRON_VALIANT]: Abilities.ADAPTABILITY, + [Species.IRON_VALIANT]: Abilities.NEUROFORCE, [Species.KORAIDON]: Abilities.OPPORTUNIST, [Species.MIRAIDON]: Abilities.OPPORTUNIST, [Species.WALKING_WAKE]: Abilities.BEAST_BOOST, [Species.IRON_LEAVES]: Abilities.SHARPNESS, [Species.POLTCHAGEIST]: Abilities.TRIAGE, - [Species.OKIDOGI]: Abilities.FUR_COAT, - [Species.MUNKIDORI]: Abilities.NEUROFORCE, - [Species.FEZANDIPITI]: Abilities.LEVITATE, + [Species.OKIDOGI]: Abilities.DARK_AURA, + [Species.MUNKIDORI]: Abilities.MAGICIAN, + [Species.FEZANDIPITI]: Abilities.PIXILATE, [Species.OGERPON]: Abilities.OPPORTUNIST, [Species.GOUGING_FIRE]: Abilities.BEAST_BOOST, [Species.RAGING_BOLT]: Abilities.BEAST_BOOST, @@ -543,31 +576,6 @@ export const starterPassiveAbilities = { [Species.IRON_CROWN]: Abilities.SHARPNESS, [Species.TERAPAGOS]: Abilities.SOUL_HEART, [Species.PECHARUNT]: Abilities.TOXIC_CHAIN, - [Species.ALOLA_RATTATA]: Abilities.ADAPTABILITY, - [Species.ALOLA_SANDSHREW]: Abilities.ICE_SCALES, - [Species.ALOLA_VULPIX]: Abilities.SHEER_FORCE, - [Species.ALOLA_DIGLETT]: Abilities.STURDY, - [Species.ALOLA_MEOWTH]: Abilities.DARK_AURA, - [Species.ALOLA_GEODUDE]: Abilities.DRY_SKIN, - [Species.ALOLA_GRIMER]: Abilities.TOXIC_DEBRIS, - [Species.ETERNAL_FLOETTE]: Abilities.MAGIC_GUARD, - [Species.GALAR_MEOWTH]: Abilities.STEELWORKER, - [Species.GALAR_PONYTA]: Abilities.MOXIE, - [Species.GALAR_SLOWPOKE]: Abilities.UNAWARE, - [Species.GALAR_FARFETCHD]: Abilities.INTREPID_SWORD, - [Species.GALAR_ARTICUNO]: Abilities.SERENE_GRACE, - [Species.GALAR_ZAPDOS]: Abilities.TOUGH_CLAWS, - [Species.GALAR_MOLTRES]: Abilities.DARK_AURA, - [Species.GALAR_CORSOLA]: Abilities.SHADOW_SHIELD, - [Species.GALAR_ZIGZAGOON]: Abilities.POISON_HEAL, - [Species.GALAR_DARUMAKA]: Abilities.FLASH_FIRE, - [Species.GALAR_YAMASK]: Abilities.TABLETS_OF_RUIN, - [Species.GALAR_STUNFISK]: Abilities.ARENA_TRAP, - [Species.HISUI_GROWLITHE]: Abilities.RECKLESS, - [Species.HISUI_VOLTORB]: Abilities.TRANSISTOR, - [Species.HISUI_QWILFISH]: Abilities.MERCILESS, - [Species.HISUI_SNEASEL]: Abilities.SCRAPPY, - [Species.HISUI_ZORUA]: Abilities.ADAPTABILITY, [Species.PALDEA_TAUROS]: Abilities.ADAPTABILITY, [Species.PALDEA_WOOPER]: Abilities.THICK_FAT, [Species.BLOODMOON_URSALUNA]: Abilities.BERSERK diff --git a/src/data/balance/pokemon-level-moves.ts b/src/data/balance/pokemon-level-moves.ts index 71d98fb4fc2..2a3ab431424 100644 --- a/src/data/balance/pokemon-level-moves.ts +++ b/src/data/balance/pokemon-level-moves.ts @@ -16,9 +16,9 @@ interface PokemonSpeciesFormLevelMoves { } /** Moves that can only be learned with a memory-mushroom */ -const RELEARN_MOVE = -1; +export const RELEARN_MOVE = -1; /** Moves that can only be learned with an evolve */ -const EVOLVE_MOVE = 0; +export const EVOLVE_MOVE = 0; export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.BULBASAUR]: [ diff --git a/src/data/balance/special-species-groups.ts b/src/data/balance/special-species-groups.ts new file mode 100644 index 00000000000..eeba96595a6 --- /dev/null +++ b/src/data/balance/special-species-groups.ts @@ -0,0 +1,46 @@ +import { Species } from "#enums/species"; + +/** + * A list of all {@link https://bulbapedia.bulbagarden.net/wiki/Paradox_Pok%C3%A9mon | Paradox Pokemon}, NOT including the legendaries Miraidon and Koraidon. + */ +export const NON_LEGEND_PARADOX_POKEMON = [ + Species.GREAT_TUSK, + Species.SCREAM_TAIL, + Species.BRUTE_BONNET, + Species.FLUTTER_MANE, + Species.SLITHER_WING, + Species.SANDY_SHOCKS, + Species.ROARING_MOON, + Species.WALKING_WAKE, + Species.GOUGING_FIRE, + Species.RAGING_BOLT, + Species.IRON_TREADS, + Species.IRON_BUNDLE, + Species.IRON_HANDS, + Species.IRON_JUGULIS, + Species.IRON_MOTH, + Species.IRON_THORNS, + Species.IRON_VALIANT, + Species.IRON_LEAVES, + Species.IRON_BOULDER, + Species.IRON_CROWN, +]; + +/** + * A list of all {@link https://bulbapedia.bulbagarden.net/wiki/Ultra_Beast | Ultra Beasts}, NOT including legendaries such as Necrozma or the Cosmog line. + * + * Note that all of these Ultra Beasts are still considered Sub-Legendary. + */ +export const NON_LEGEND_ULTRA_BEASTS = [ + Species.NIHILEGO, + Species.BUZZWOLE, + Species.PHEROMOSA, + Species.XURKITREE, + Species.CELESTEELA, + Species.KARTANA, + Species.GUZZLORD, + Species.POIPOLE, + Species.NAGANADEL, + Species.STAKATAKA, + Species.BLACEPHALON, +]; diff --git a/src/data/balance/species-egg-tiers.ts b/src/data/balance/species-egg-tiers.ts index 27baa18151a..fee48695565 100644 --- a/src/data/balance/species-egg-tiers.ts +++ b/src/data/balance/species-egg-tiers.ts @@ -14,13 +14,10 @@ export const speciesEggTiers = { [Species.RATTATA]: EggTier.COMMON, [Species.SPEAROW]: EggTier.COMMON, [Species.EKANS]: EggTier.COMMON, - [Species.PIKACHU]: EggTier.COMMON, [Species.SANDSHREW]: EggTier.COMMON, [Species.NIDORAN_F]: EggTier.COMMON, [Species.NIDORAN_M]: EggTier.COMMON, - [Species.CLEFAIRY]: EggTier.COMMON, [Species.VULPIX]: EggTier.COMMON, - [Species.JIGGLYPUFF]: EggTier.COMMON, [Species.ZUBAT]: EggTier.COMMON, [Species.ODDISH]: EggTier.COMMON, [Species.PARAS]: EggTier.COMMON, @@ -39,7 +36,7 @@ export const speciesEggTiers = { [Species.PONYTA]: EggTier.COMMON, [Species.SLOWPOKE]: EggTier.COMMON, [Species.MAGNEMITE]: EggTier.RARE, - [Species.FARFETCHD]: EggTier.COMMON, + [Species.FARFETCHD]: EggTier.RARE, [Species.DODUO]: EggTier.COMMON, [Species.SEEL]: EggTier.COMMON, [Species.GRIMER]: EggTier.COMMON, @@ -51,33 +48,25 @@ export const speciesEggTiers = { [Species.VOLTORB]: EggTier.COMMON, [Species.EXEGGCUTE]: EggTier.COMMON, [Species.CUBONE]: EggTier.COMMON, - [Species.HITMONLEE]: EggTier.RARE, - [Species.HITMONCHAN]: EggTier.RARE, - [Species.LICKITUNG]: EggTier.COMMON, + [Species.LICKITUNG]: EggTier.RARE, [Species.KOFFING]: EggTier.COMMON, - [Species.RHYHORN]: EggTier.COMMON, - [Species.CHANSEY]: EggTier.COMMON, + [Species.RHYHORN]: EggTier.RARE, [Species.TANGELA]: EggTier.COMMON, [Species.KANGASKHAN]: EggTier.RARE, [Species.HORSEA]: EggTier.COMMON, [Species.GOLDEEN]: EggTier.COMMON, [Species.STARYU]: EggTier.COMMON, - [Species.MR_MIME]: EggTier.COMMON, [Species.SCYTHER]: EggTier.RARE, - [Species.JYNX]: EggTier.RARE, - [Species.ELECTABUZZ]: EggTier.RARE, - [Species.MAGMAR]: EggTier.RARE, [Species.PINSIR]: EggTier.RARE, [Species.TAUROS]: EggTier.RARE, - [Species.MAGIKARP]: EggTier.RARE, + [Species.MAGIKARP]: EggTier.COMMON, [Species.LAPRAS]: EggTier.RARE, [Species.DITTO]: EggTier.COMMON, [Species.EEVEE]: EggTier.COMMON, [Species.PORYGON]: EggTier.RARE, - [Species.OMANYTE]: EggTier.COMMON, - [Species.KABUTO]: EggTier.COMMON, + [Species.OMANYTE]: EggTier.RARE, + [Species.KABUTO]: EggTier.RARE, [Species.AERODACTYL]: EggTier.RARE, - [Species.SNORLAX]: EggTier.RARE, [Species.ARTICUNO]: EggTier.EPIC, [Species.ZAPDOS]: EggTier.EPIC, [Species.MOLTRES]: EggTier.EPIC, @@ -93,14 +82,12 @@ export const speciesEggTiers = { [Species.LEDYBA]: EggTier.COMMON, [Species.SPINARAK]: EggTier.COMMON, [Species.CHINCHOU]: EggTier.COMMON, - [Species.PICHU]: EggTier.COMMON, + [Species.PICHU]: EggTier.RARE, [Species.CLEFFA]: EggTier.COMMON, [Species.IGGLYBUFF]: EggTier.COMMON, [Species.TOGEPI]: EggTier.COMMON, [Species.NATU]: EggTier.COMMON, [Species.MAREEP]: EggTier.COMMON, - [Species.MARILL]: EggTier.RARE, - [Species.SUDOWOODO]: EggTier.COMMON, [Species.HOPPIP]: EggTier.COMMON, [Species.AIPOM]: EggTier.COMMON, [Species.SUNKERN]: EggTier.COMMON, @@ -109,7 +96,6 @@ export const speciesEggTiers = { [Species.MURKROW]: EggTier.COMMON, [Species.MISDREAVUS]: EggTier.COMMON, [Species.UNOWN]: EggTier.COMMON, - [Species.WOBBUFFET]: EggTier.COMMON, [Species.GIRAFARIG]: EggTier.COMMON, [Species.PINECO]: EggTier.COMMON, [Species.DUNSPARCE]: EggTier.COMMON, @@ -125,7 +111,6 @@ export const speciesEggTiers = { [Species.CORSOLA]: EggTier.COMMON, [Species.REMORAID]: EggTier.COMMON, [Species.DELIBIRD]: EggTier.COMMON, - [Species.MANTINE]: EggTier.COMMON, [Species.SKARMORY]: EggTier.RARE, [Species.HOUNDOUR]: EggTier.COMMON, [Species.PHANPY]: EggTier.COMMON, @@ -145,7 +130,7 @@ export const speciesEggTiers = { [Species.CELEBI]: EggTier.EPIC, [Species.TREECKO]: EggTier.COMMON, - [Species.TORCHIC]: EggTier.RARE, + [Species.TORCHIC]: EggTier.COMMON, [Species.MUDKIP]: EggTier.COMMON, [Species.POOCHYENA]: EggTier.COMMON, [Species.ZIGZAGOON]: EggTier.COMMON, @@ -154,14 +139,14 @@ export const speciesEggTiers = { [Species.SEEDOT]: EggTier.COMMON, [Species.TAILLOW]: EggTier.COMMON, [Species.WINGULL]: EggTier.COMMON, - [Species.RALTS]: EggTier.COMMON, + [Species.RALTS]: EggTier.RARE, [Species.SURSKIT]: EggTier.COMMON, [Species.SHROOMISH]: EggTier.COMMON, [Species.SLAKOTH]: EggTier.RARE, [Species.NINCADA]: EggTier.RARE, [Species.WHISMUR]: EggTier.COMMON, [Species.MAKUHITA]: EggTier.COMMON, - [Species.AZURILL]: EggTier.RARE, + [Species.AZURILL]: EggTier.COMMON, [Species.NOSEPASS]: EggTier.COMMON, [Species.SKITTY]: EggTier.COMMON, [Species.SABLEYE]: EggTier.COMMON, @@ -173,7 +158,6 @@ export const speciesEggTiers = { [Species.MINUN]: EggTier.COMMON, [Species.VOLBEAT]: EggTier.COMMON, [Species.ILLUMISE]: EggTier.COMMON, - [Species.ROSELIA]: EggTier.COMMON, [Species.GULPIN]: EggTier.COMMON, [Species.CARVANHA]: EggTier.COMMON, [Species.WAILMER]: EggTier.COMMON, @@ -191,21 +175,20 @@ export const speciesEggTiers = { [Species.BARBOACH]: EggTier.COMMON, [Species.CORPHISH]: EggTier.COMMON, [Species.BALTOY]: EggTier.COMMON, - [Species.LILEEP]: EggTier.COMMON, - [Species.ANORITH]: EggTier.COMMON, + [Species.LILEEP]: EggTier.RARE, + [Species.ANORITH]: EggTier.RARE, [Species.FEEBAS]: EggTier.RARE, [Species.CASTFORM]: EggTier.COMMON, [Species.KECLEON]: EggTier.COMMON, [Species.SHUPPET]: EggTier.COMMON, [Species.DUSKULL]: EggTier.COMMON, [Species.TROPIUS]: EggTier.COMMON, - [Species.CHIMECHO]: EggTier.COMMON, [Species.ABSOL]: EggTier.RARE, [Species.WYNAUT]: EggTier.COMMON, [Species.SNORUNT]: EggTier.COMMON, [Species.SPHEAL]: EggTier.COMMON, [Species.CLAMPERL]: EggTier.COMMON, - [Species.RELICANTH]: EggTier.COMMON, + [Species.RELICANTH]: EggTier.RARE, [Species.LUVDISC]: EggTier.COMMON, [Species.BAGON]: EggTier.RARE, [Species.BELDUM]: EggTier.RARE, @@ -228,8 +211,8 @@ export const speciesEggTiers = { [Species.KRICKETOT]: EggTier.COMMON, [Species.SHINX]: EggTier.COMMON, [Species.BUDEW]: EggTier.COMMON, - [Species.CRANIDOS]: EggTier.COMMON, - [Species.SHIELDON]: EggTier.COMMON, + [Species.CRANIDOS]: EggTier.RARE, + [Species.SHIELDON]: EggTier.RARE, [Species.BURMY]: EggTier.COMMON, [Species.COMBEE]: EggTier.COMMON, [Species.PACHIRISU]: EggTier.COMMON, @@ -244,12 +227,12 @@ export const speciesEggTiers = { [Species.BRONZOR]: EggTier.COMMON, [Species.BONSLY]: EggTier.COMMON, [Species.MIME_JR]: EggTier.COMMON, - [Species.HAPPINY]: EggTier.COMMON, + [Species.HAPPINY]: EggTier.RARE, [Species.CHATOT]: EggTier.COMMON, [Species.SPIRITOMB]: EggTier.RARE, [Species.GIBLE]: EggTier.RARE, [Species.MUNCHLAX]: EggTier.RARE, - [Species.RIOLU]: EggTier.COMMON, + [Species.RIOLU]: EggTier.RARE, [Species.HIPPOPOTAS]: EggTier.COMMON, [Species.SKORUPI]: EggTier.COMMON, [Species.CROAGUNK]: EggTier.COMMON, @@ -264,10 +247,10 @@ export const speciesEggTiers = { [Species.DIALGA]: EggTier.LEGENDARY, [Species.PALKIA]: EggTier.LEGENDARY, [Species.HEATRAN]: EggTier.EPIC, - [Species.REGIGIGAS]: EggTier.EPIC, + [Species.REGIGIGAS]: EggTier.LEGENDARY, [Species.GIRATINA]: EggTier.LEGENDARY, [Species.CRESSELIA]: EggTier.EPIC, - [Species.PHIONE]: EggTier.RARE, + [Species.PHIONE]: EggTier.EPIC, [Species.MANAPHY]: EggTier.EPIC, [Species.DARKRAI]: EggTier.EPIC, [Species.SHAYMIN]: EggTier.EPIC, @@ -289,7 +272,7 @@ export const speciesEggTiers = { [Species.ROGGENROLA]: EggTier.COMMON, [Species.WOOBAT]: EggTier.COMMON, [Species.DRILBUR]: EggTier.RARE, - [Species.AUDINO]: EggTier.COMMON, + [Species.AUDINO]: EggTier.RARE, [Species.TIMBURR]: EggTier.RARE, [Species.TYMPOLE]: EggTier.COMMON, [Species.THROH]: EggTier.RARE, @@ -306,8 +289,8 @@ export const speciesEggTiers = { [Species.SCRAGGY]: EggTier.COMMON, [Species.SIGILYPH]: EggTier.RARE, [Species.YAMASK]: EggTier.COMMON, - [Species.TIRTOUGA]: EggTier.COMMON, - [Species.ARCHEN]: EggTier.COMMON, + [Species.TIRTOUGA]: EggTier.RARE, + [Species.ARCHEN]: EggTier.RARE, [Species.TRUBBISH]: EggTier.COMMON, [Species.ZORUA]: EggTier.COMMON, [Species.MINCCINO]: EggTier.COMMON, @@ -339,7 +322,7 @@ export const speciesEggTiers = { [Species.BOUFFALANT]: EggTier.RARE, [Species.RUFFLET]: EggTier.COMMON, [Species.VULLABY]: EggTier.COMMON, - [Species.HEATMOR]: EggTier.COMMON, + [Species.HEATMOR]: EggTier.RARE, [Species.DURANT]: EggTier.RARE, [Species.DEINO]: EggTier.RARE, [Species.LARVESTA]: EggTier.RARE, @@ -358,7 +341,7 @@ export const speciesEggTiers = { [Species.CHESPIN]: EggTier.COMMON, [Species.FENNEKIN]: EggTier.COMMON, - [Species.FROAKIE]: EggTier.RARE, + [Species.FROAKIE]: EggTier.COMMON, [Species.BUNNELBY]: EggTier.COMMON, [Species.FLETCHLING]: EggTier.COMMON, [Species.SCATTERBUG]: EggTier.COMMON, @@ -376,8 +359,8 @@ export const speciesEggTiers = { [Species.SKRELP]: EggTier.COMMON, [Species.CLAUNCHER]: EggTier.COMMON, [Species.HELIOPTILE]: EggTier.COMMON, - [Species.TYRUNT]: EggTier.COMMON, - [Species.AMAURA]: EggTier.COMMON, + [Species.TYRUNT]: EggTier.RARE, + [Species.AMAURA]: EggTier.RARE, [Species.HAWLUCHA]: EggTier.RARE, [Species.DEDENNE]: EggTier.COMMON, [Species.CARBINK]: EggTier.COMMON, @@ -386,18 +369,18 @@ export const speciesEggTiers = { [Species.PHANTUMP]: EggTier.COMMON, [Species.PUMPKABOO]: EggTier.COMMON, [Species.BERGMITE]: EggTier.COMMON, - [Species.NOIBAT]: EggTier.COMMON, + [Species.NOIBAT]: EggTier.RARE, [Species.XERNEAS]: EggTier.LEGENDARY, [Species.YVELTAL]: EggTier.LEGENDARY, [Species.ZYGARDE]: EggTier.LEGENDARY, [Species.DIANCIE]: EggTier.EPIC, [Species.HOOPA]: EggTier.EPIC, [Species.VOLCANION]: EggTier.EPIC, - [Species.ETERNAL_FLOETTE]: EggTier.RARE, + [Species.ETERNAL_FLOETTE]: EggTier.EPIC, [Species.ROWLET]: EggTier.COMMON, [Species.LITTEN]: EggTier.COMMON, - [Species.POPPLIO]: EggTier.RARE, + [Species.POPPLIO]: EggTier.COMMON, [Species.PIKIPEK]: EggTier.COMMON, [Species.YUNGOOS]: EggTier.COMMON, [Species.GRUBBIN]: EggTier.COMMON, @@ -420,7 +403,7 @@ export const speciesEggTiers = { [Species.WIMPOD]: EggTier.COMMON, [Species.SANDYGAST]: EggTier.COMMON, [Species.PYUKUMUKU]: EggTier.COMMON, - [Species.TYPE_NULL]: EggTier.RARE, + [Species.TYPE_NULL]: EggTier.EPIC, [Species.MINIOR]: EggTier.RARE, [Species.KOMALA]: EggTier.COMMON, [Species.TURTONATOR]: EggTier.RARE, @@ -434,7 +417,7 @@ export const speciesEggTiers = { [Species.TAPU_LELE]: EggTier.EPIC, [Species.TAPU_BULU]: EggTier.EPIC, [Species.TAPU_FINI]: EggTier.EPIC, - [Species.COSMOG]: EggTier.EPIC, + [Species.COSMOG]: EggTier.LEGENDARY, [Species.NIHILEGO]: EggTier.EPIC, [Species.BUZZWOLE]: EggTier.EPIC, [Species.PHEROMOSA]: EggTier.EPIC, @@ -451,15 +434,15 @@ export const speciesEggTiers = { [Species.ZERAORA]: EggTier.EPIC, [Species.MELTAN]: EggTier.EPIC, [Species.ALOLA_RATTATA]: EggTier.COMMON, - [Species.ALOLA_SANDSHREW]: EggTier.COMMON, - [Species.ALOLA_VULPIX]: EggTier.COMMON, - [Species.ALOLA_DIGLETT]: EggTier.COMMON, - [Species.ALOLA_MEOWTH]: EggTier.COMMON, - [Species.ALOLA_GEODUDE]: EggTier.COMMON, - [Species.ALOLA_GRIMER]: EggTier.COMMON, + [Species.ALOLA_SANDSHREW]: EggTier.RARE, + [Species.ALOLA_VULPIX]: EggTier.RARE, + [Species.ALOLA_DIGLETT]: EggTier.RARE, + [Species.ALOLA_MEOWTH]: EggTier.RARE, + [Species.ALOLA_GEODUDE]: EggTier.RARE, + [Species.ALOLA_GRIMER]: EggTier.RARE, [Species.GROOKEY]: EggTier.COMMON, - [Species.SCORBUNNY]: EggTier.RARE, + [Species.SCORBUNNY]: EggTier.COMMON, [Species.SOBBLE]: EggTier.COMMON, [Species.SKWOVET]: EggTier.COMMON, [Species.ROOKIDEE]: EggTier.COMMON, @@ -505,29 +488,28 @@ export const speciesEggTiers = { [Species.GLASTRIER]: EggTier.EPIC, [Species.SPECTRIER]: EggTier.EPIC, [Species.CALYREX]: EggTier.LEGENDARY, - [Species.GALAR_MEOWTH]: EggTier.COMMON, - [Species.GALAR_PONYTA]: EggTier.COMMON, - [Species.GALAR_SLOWPOKE]: EggTier.COMMON, - [Species.GALAR_FARFETCHD]: EggTier.COMMON, - [Species.GALAR_CORSOLA]: EggTier.COMMON, - [Species.GALAR_ZIGZAGOON]: EggTier.COMMON, - [Species.GALAR_DARUMAKA]: EggTier.RARE, - [Species.GALAR_YAMASK]: EggTier.COMMON, - [Species.GALAR_STUNFISK]: EggTier.COMMON, - [Species.GALAR_MR_MIME]: EggTier.COMMON, + [Species.ENAMORUS]: EggTier.EPIC, + [Species.GALAR_MEOWTH]: EggTier.RARE, + [Species.GALAR_PONYTA]: EggTier.RARE, + [Species.GALAR_SLOWPOKE]: EggTier.RARE, + [Species.GALAR_FARFETCHD]: EggTier.RARE, [Species.GALAR_ARTICUNO]: EggTier.EPIC, [Species.GALAR_ZAPDOS]: EggTier.EPIC, [Species.GALAR_MOLTRES]: EggTier.EPIC, + [Species.GALAR_CORSOLA]: EggTier.RARE, + [Species.GALAR_ZIGZAGOON]: EggTier.RARE, + [Species.GALAR_DARUMAKA]: EggTier.RARE, + [Species.GALAR_YAMASK]: EggTier.RARE, + [Species.GALAR_STUNFISK]: EggTier.RARE, [Species.HISUI_GROWLITHE]: EggTier.RARE, - [Species.HISUI_VOLTORB]: EggTier.COMMON, + [Species.HISUI_VOLTORB]: EggTier.RARE, [Species.HISUI_QWILFISH]: EggTier.RARE, [Species.HISUI_SNEASEL]: EggTier.RARE, - [Species.HISUI_ZORUA]: EggTier.COMMON, - [Species.ENAMORUS]: EggTier.EPIC, + [Species.HISUI_ZORUA]: EggTier.RARE, - [Species.SPRIGATITO]: EggTier.RARE, - [Species.FUECOCO]: EggTier.RARE, - [Species.QUAXLY]: EggTier.RARE, + [Species.SPRIGATITO]: EggTier.COMMON, + [Species.FUECOCO]: EggTier.COMMON, + [Species.QUAXLY]: EggTier.COMMON, [Species.LECHONK]: EggTier.COMMON, [Species.TAROUNTULA]: EggTier.COMMON, [Species.NYMBLE]: EggTier.COMMON, @@ -551,7 +533,7 @@ export const speciesEggTiers = { [Species.TINKATINK]: EggTier.RARE, [Species.WIGLETT]: EggTier.COMMON, [Species.BOMBIRDIER]: EggTier.COMMON, - [Species.FINIZEN]: EggTier.COMMON, + [Species.FINIZEN]: EggTier.RARE, [Species.VAROOM]: EggTier.RARE, [Species.CYCLIZAR]: EggTier.RARE, [Species.ORTHWORM]: EggTier.RARE, @@ -598,6 +580,6 @@ export const speciesEggTiers = { [Species.TERAPAGOS]: EggTier.LEGENDARY, [Species.PECHARUNT]: EggTier.EPIC, [Species.PALDEA_TAUROS]: EggTier.RARE, - [Species.PALDEA_WOOPER]: EggTier.COMMON, - [Species.BLOODMOON_URSALUNA]: EggTier.EPIC, + [Species.PALDEA_WOOPER]: EggTier.RARE, + [Species.BLOODMOON_URSALUNA]: EggTier.EPIC }; diff --git a/src/data/balance/starters.ts b/src/data/balance/starters.ts index d6a1f0c3eaf..ec66401675b 100644 --- a/src/data/balance/starters.ts +++ b/src/data/balance/starters.ts @@ -3,10 +3,10 @@ import { Species } from "#enums/species"; export const POKERUS_STARTER_COUNT = 5; // #region Friendship constants -export const CLASSIC_CANDY_FRIENDSHIP_MULTIPLIER = 2; -export const FRIENDSHIP_GAIN_FROM_BATTLE = 2; -export const FRIENDSHIP_GAIN_FROM_RARE_CANDY = 5; -export const FRIENDSHIP_LOSS_FROM_FAINT = 10; +export const CLASSIC_CANDY_FRIENDSHIP_MULTIPLIER = 3; +export const FRIENDSHIP_GAIN_FROM_BATTLE = 3; +export const FRIENDSHIP_GAIN_FROM_RARE_CANDY = 6; +export const FRIENDSHIP_LOSS_FROM_FAINT = 5; /** * Function to get the cumulative friendship threshold at which a candy is earned @@ -16,19 +16,19 @@ export const FRIENDSHIP_LOSS_FROM_FAINT = 10; export function getStarterValueFriendshipCap(starterCost: number): number { switch (starterCost) { case 1: - return 20; + return 25; case 2: - return 40; + return 50; case 3: - return 60; + return 75; case 4: return 100; case 5: - return 140; + return 150; case 6: return 200; case 7: - return 280; + return 300; case 8: case 9: return 450; @@ -47,7 +47,7 @@ export const speciesStarterCosts = { [Species.RATTATA]: 1, [Species.SPEAROW]: 1, [Species.EKANS]: 2, - [Species.PIKACHU]: 3, + [Species.PIKACHU]: 4, [Species.SANDSHREW]: 2, [Species.NIDORAN_F]: 3, [Species.NIDORAN_M]: 3, @@ -88,7 +88,7 @@ export const speciesStarterCosts = { [Species.HITMONCHAN]: 4, [Species.LICKITUNG]: 3, [Species.KOFFING]: 2, - [Species.RHYHORN]: 3, + [Species.RHYHORN]: 4, [Species.CHANSEY]: 3, [Species.TANGELA]: 3, [Species.KANGASKHAN]: 4, @@ -111,12 +111,12 @@ export const speciesStarterCosts = { [Species.KABUTO]: 3, [Species.AERODACTYL]: 5, [Species.SNORLAX]: 5, - [Species.ARTICUNO]: 6, + [Species.ARTICUNO]: 5, [Species.ZAPDOS]: 6, [Species.MOLTRES]: 6, [Species.DRATINI]: 4, [Species.MEWTWO]: 8, - [Species.MEW]: 6, + [Species.MEW]: 5, [Species.CHIKORITA]: 2, [Species.CYNDAQUIL]: 3, @@ -126,7 +126,7 @@ export const speciesStarterCosts = { [Species.LEDYBA]: 1, [Species.SPINARAK]: 1, [Species.CHINCHOU]: 2, - [Species.PICHU]: 2, + [Species.PICHU]: 4, [Species.CLEFFA]: 2, [Species.IGGLYBUFF]: 1, [Species.TOGEPI]: 3, @@ -175,7 +175,7 @@ export const speciesStarterCosts = { [Species.LARVITAR]: 4, [Species.LUGIA]: 8, [Species.HO_OH]: 8, - [Species.CELEBI]: 6, + [Species.CELEBI]: 5, [Species.TREECKO]: 3, [Species.TORCHIC]: 4, @@ -187,7 +187,7 @@ export const speciesStarterCosts = { [Species.SEEDOT]: 2, [Species.TAILLOW]: 3, [Species.WINGULL]: 2, - [Species.RALTS]: 3, + [Species.RALTS]: 4, [Species.SURSKIT]: 2, [Species.SHROOMISH]: 3, [Species.SLAKOTH]: 4, @@ -198,7 +198,7 @@ export const speciesStarterCosts = { [Species.NOSEPASS]: 2, [Species.SKITTY]: 1, [Species.SABLEYE]: 2, - [Species.MAWILE]: 3, + [Species.MAWILE]: 2, [Species.ARON]: 3, [Species.MEDITITE]: 3, [Species.ELECTRIKE]: 2, @@ -243,7 +243,7 @@ export const speciesStarterCosts = { [Species.BAGON]: 4, [Species.BELDUM]: 4, [Species.REGIROCK]: 6, - [Species.REGICE]: 6, + [Species.REGICE]: 5, [Species.REGISTEEL]: 6, [Species.LATIAS]: 7, [Species.LATIOS]: 7, @@ -291,19 +291,19 @@ export const speciesStarterCosts = { [Species.MANTYKE]: 2, [Species.SNOVER]: 2, [Species.ROTOM]: 5, - [Species.UXIE]: 6, - [Species.MESPRIT]: 6, + [Species.UXIE]: 5, + [Species.MESPRIT]: 5, [Species.AZELF]: 6, [Species.DIALGA]: 8, [Species.PALKIA]: 8, - [Species.HEATRAN]: 6, + [Species.HEATRAN]: 7, [Species.REGIGIGAS]: 7, [Species.GIRATINA]: 8, [Species.CRESSELIA]: 6, [Species.PHIONE]: 4, [Species.MANAPHY]: 7, [Species.DARKRAI]: 7, - [Species.SHAYMIN]: 6, + [Species.SHAYMIN]: 5, [Species.ARCEUS]: 9, [Species.VICTINI]: 7, @@ -351,7 +351,7 @@ export const speciesStarterCosts = { [Species.DEERLING]: 2, [Species.EMOLGA]: 2, [Species.KARRABLAST]: 3, - [Species.FOONGUS]: 2, + [Species.FOONGUS]: 3, [Species.FRILLISH]: 3, [Species.ALOMOMOLA]: 4, [Species.JOLTIK]: 3, @@ -410,7 +410,7 @@ export const speciesStarterCosts = { [Species.CLAUNCHER]: 3, [Species.HELIOPTILE]: 3, [Species.TYRUNT]: 3, - [Species.AMAURA]: 3, + [Species.AMAURA]: 2, [Species.HAWLUCHA]: 4, [Species.DEDENNE]: 2, [Species.CARBINK]: 2, @@ -425,7 +425,7 @@ export const speciesStarterCosts = { [Species.ZYGARDE]: 8, [Species.DIANCIE]: 7, [Species.HOOPA]: 7, - [Species.VOLCANION]: 6, + [Species.VOLCANION]: 7, [Species.ETERNAL_FLOETTE]: 4, [Species.ROWLET]: 3, @@ -464,21 +464,21 @@ export const speciesStarterCosts = { [Species.DHELMISE]: 4, [Species.JANGMO_O]: 4, [Species.TAPU_KOKO]: 6, - [Species.TAPU_LELE]: 6, + [Species.TAPU_LELE]: 7, [Species.TAPU_BULU]: 6, - [Species.TAPU_FINI]: 6, + [Species.TAPU_FINI]: 5, [Species.COSMOG]: 7, [Species.NIHILEGO]: 6, [Species.BUZZWOLE]: 6, [Species.PHEROMOSA]: 7, [Species.XURKITREE]: 6, [Species.CELESTEELA]: 6, - [Species.KARTANA]: 7, + [Species.KARTANA]: 8, [Species.GUZZLORD]: 6, [Species.NECROZMA]: 8, [Species.MAGEARNA]: 7, [Species.MARSHADOW]: 7, - [Species.POIPOLE]: 7, + [Species.POIPOLE]: 8, [Species.STAKATAKA]: 6, [Species.BLACEPHALON]: 7, [Species.ZERAORA]: 6, @@ -532,31 +532,31 @@ export const speciesStarterCosts = { [Species.ZAMAZENTA]: 8, [Species.ETERNATUS]: 10, [Species.KUBFU]: 6, - [Species.ZARUDE]: 6, + [Species.ZARUDE]: 5, [Species.REGIELEKI]: 6, [Species.REGIDRAGO]: 6, [Species.GLASTRIER]: 6, - [Species.SPECTRIER]: 7, + [Species.SPECTRIER]: 8, [Species.CALYREX]: 8, + [Species.ENAMORUS]: 7, [Species.GALAR_MEOWTH]: 3, [Species.GALAR_PONYTA]: 2, [Species.GALAR_SLOWPOKE]: 3, [Species.GALAR_FARFETCHD]: 3, + [Species.GALAR_MR_MIME]: 3, + [Species.GALAR_ARTICUNO]: 6, + [Species.GALAR_ZAPDOS]: 6, + [Species.GALAR_MOLTRES]: 6, [Species.GALAR_CORSOLA]: 3, [Species.GALAR_ZIGZAGOON]: 3, [Species.GALAR_DARUMAKA]: 4, [Species.GALAR_YAMASK]: 3, [Species.GALAR_STUNFISK]: 2, - [Species.GALAR_MR_MIME]: 3, - [Species.GALAR_ARTICUNO]: 6, - [Species.GALAR_ZAPDOS]: 6, - [Species.GALAR_MOLTRES]: 6, [Species.HISUI_GROWLITHE]: 4, [Species.HISUI_VOLTORB]: 3, [Species.HISUI_QWILFISH]: 4, [Species.HISUI_SNEASEL]: 5, [Species.HISUI_ZORUA]: 3, - [Species.ENAMORUS]: 7, [Species.SPRIGATITO]: 4, [Species.FUECOCO]: 4, @@ -595,9 +595,9 @@ export const speciesStarterCosts = { [Species.VELUZA]: 4, [Species.DONDOZO]: 4, [Species.TATSUGIRI]: 4, - [Species.GREAT_TUSK]: 6, - [Species.SCREAM_TAIL]: 6, - [Species.BRUTE_BONNET]: 6, + [Species.GREAT_TUSK]: 7, + [Species.SCREAM_TAIL]: 5, + [Species.BRUTE_BONNET]: 5, [Species.FLUTTER_MANE]: 7, [Species.SLITHER_WING]: 6, [Species.SANDY_SHOCKS]: 6, @@ -606,33 +606,33 @@ export const speciesStarterCosts = { [Species.IRON_HANDS]: 6, [Species.IRON_JUGULIS]: 6, [Species.IRON_MOTH]: 6, - [Species.IRON_THORNS]: 6, + [Species.IRON_THORNS]: 5, [Species.FRIGIBAX]: 4, [Species.GIMMIGHOUL]: 4, - [Species.WO_CHIEN]: 6, + [Species.WO_CHIEN]: 5, [Species.CHIEN_PAO]: 7, [Species.TING_LU]: 6, [Species.CHI_YU]: 7, - [Species.ROARING_MOON]: 6, + [Species.ROARING_MOON]: 7, [Species.IRON_VALIANT]: 6, [Species.KORAIDON]: 9, [Species.MIRAIDON]: 9, - [Species.WALKING_WAKE]: 6, + [Species.WALKING_WAKE]: 7, [Species.IRON_LEAVES]: 6, [Species.POLTCHAGEIST]: 4, [Species.OKIDOGI]: 6, [Species.MUNKIDORI]: 6, - [Species.FEZANDIPITI]: 6, + [Species.FEZANDIPITI]: 5, [Species.OGERPON]: 7, [Species.GOUGING_FIRE]: 7, - [Species.RAGING_BOLT]: 6, + [Species.RAGING_BOLT]: 7, [Species.IRON_BOULDER]: 7, - [Species.IRON_CROWN]: 6, + [Species.IRON_CROWN]: 7, [Species.TERAPAGOS]: 8, [Species.PECHARUNT]: 6, [Species.PALDEA_TAUROS]: 5, [Species.PALDEA_WOOPER]: 3, - [Species.BLOODMOON_URSALUNA]: 6, + [Species.BLOODMOON_URSALUNA]: 5, }; const starterCandyCosts: { passive: number; costReduction: [number, number]; egg: number; }[] = [ diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index 5928a65b4e3..26ad65bd9b0 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -90,6 +90,7 @@ export enum CommonAnim { RAGING_BULL_FIRE, RAGING_BULL_WATER, SALT_CURE, + POWDER, SUNNY = 2100, RAIN, SANDSTORM, diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index ce25b56157c..0c0b8e9e034 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -856,6 +856,59 @@ export class SeedTag extends BattlerTag { } } +/** + * BattlerTag representing the effects of {@link https://bulbapedia.bulbagarden.net/wiki/Powder_(move) | Powder}. + * When the afflicted Pokemon uses a Fire-type move, the move is cancelled, and the + * Pokemon takes damage equal to 1/4 of it's maximum HP (rounded down). + */ +export class PowderTag extends BattlerTag { + constructor() { + super(BattlerTagType.POWDER, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], 1); + } + + onAdd(pokemon: Pokemon): void { + super.onAdd(pokemon); + + // "{Pokemon} is covered in powder!" + pokemon.scene.queueMessage(i18next.t("battlerTags:powderOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + } + + /** + * Applies Powder's effects before the tag owner uses a Fire-type move. + * Also causes the tag to expire at the end of turn. + * @param pokemon {@linkcode Pokemon} the owner of this tag + * @param lapseType {@linkcode BattlerTagLapseType} the type of lapse functionality to carry out + * @returns `true` if the tag should not expire after this lapse; `false` otherwise. + */ + lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { + if (lapseType === BattlerTagLapseType.PRE_MOVE) { + const movePhase = pokemon.scene.getCurrentPhase(); + if (movePhase instanceof MovePhase) { + const move = movePhase.move.getMove(); + const weather = pokemon.scene.arena.weather; + if (pokemon.getMoveType(move) === Type.FIRE && !(weather && weather.weatherType === WeatherType.HEAVY_RAIN && !weather.isEffectSuppressed(pokemon.scene))) { + movePhase.fail(); + movePhase.showMoveText(); + + pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.POWDER)); + + const cancelDamage = new BooleanHolder(false); + applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelDamage); + if (!cancelDamage.value) { + pokemon.damageAndUpdate(Math.floor(pokemon.getMaxHp() / 4), HitResult.OTHER); + } + + // "When the flame touched the powder\non the Pokémon, it exploded!" + pokemon.scene.queueMessage(i18next.t("battlerTags:powderLapse", { moveName: move.name })); + } + } + return true; + } else { + return super.lapse(pokemon, lapseType); + } + } +} + export class NightmareTag extends BattlerTag { constructor() { super(BattlerTagType.NIGHTMARE, BattlerTagLapseType.TURN_END, 1, Moves.NIGHTMARE); @@ -1085,10 +1138,6 @@ export class OctolockTag extends TrappedTag { super(BattlerTagType.OCTOLOCK, BattlerTagLapseType.TURN_END, 1, Moves.OCTOLOCK, sourceId); } - canAdd(pokemon: Pokemon): boolean { - return !pokemon.getTag(BattlerTagType.OCTOLOCK); - } - lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { const shouldLapse = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); @@ -2959,6 +3008,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source return new InfatuatedTag(sourceMove, sourceId); case BattlerTagType.SEEDED: return new SeedTag(sourceId); + case BattlerTagType.POWDER: + return new PowderTag(); case BattlerTagType.NIGHTMARE: return new NightmareTag(); case BattlerTagType.FRENZY: diff --git a/src/data/egg.ts b/src/data/egg.ts index f7d109dfa62..7f1deecc63f 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -17,39 +17,44 @@ export const EGG_SEED = 1073741824; /** Egg options to override egg properties */ export interface IEggOptions { - /** Id. Used to check if egg type will be manaphy (id % 204 === 0) */ + /** ID. Used to check if egg type will be manaphy (`id % 204 === 0`) */ id?: number; /** Timestamp when this egg got created */ timestamp?: number; - /** Defines if the egg got pulled from a gacha or not. If true, egg pity and pull statistics will be applyed. + /** + * Defines if the egg got pulled from a gacha or not. If true, egg pity and pull statistics will be applyed. * Egg will be automaticly added to the game data. - * NEEDS scene eggOption to work. + * NEEDS `scene` `eggOption` to work. */ pulled?: boolean; - /** Defines where the egg comes from. Applies specific modifiers. + /** + * Defines where the egg comes from. Applies specific modifiers. * Will also define the text displayed in the egg list. */ sourceType?: EggSourceType; - /** Needs to be defined if eggOption pulled is defined or if no species or isShiny is degined since this will be needed to generate them. */ + /** Needs to be defined if `eggOption` pulled is defined or if no species or `isShiny` is defined since this will be needed to generate them. */ scene?: BattleScene; - /** Sets the tier of the egg. Only species of this tier can be hatched from this egg. - * Tier will be overriden if species eggOption is set. + /** + * Sets the tier of the egg. Only species of this tier can be hatched from this egg. + * Tier will be overriden if species `eggOption` is set. */ tier?: EggTier; /** Sets how many waves it will take till this egg hatches. */ hatchWaves?: number; - /** Sets the exact species that will hatch from this egg. - * Needs scene eggOption if not provided. + /** + * Sets the exact species that will hatch from this egg. + * Needs `scene` `eggOption` if not provided. */ species?: Species; /** Defines if the hatched pokemon will be a shiny. */ isShiny?: boolean; - /** Defines the variant of the pokemon that will hatch from this egg. If no variantTier is given the normal variant rates will apply. */ + /** Defines the variant of the pokemon that will hatch from this egg. If no `variantTier` is given the normal variant rates will apply. */ variantTier?: VariantTier; - /** Defines which egg move will be unlocked. 3 = rare egg move. */ + /** Defines which egg move will be unlocked. `3` = rare egg move. */ eggMoveIndex?: number; - /** Defines if the egg will hatch with the hidden ability of this species. - * If no hidden ability exist, a random one will get choosen. + /** + * Defines if the egg will hatch with the hidden ability of this species. + * If no hidden ability exist, a random one will get choosen. */ overrideHiddenAbility?: boolean, @@ -418,7 +423,7 @@ export class Egg { } /** - * Pokemon that are cheaper in their tier get a weight boost. Regionals get a weight penalty + * Pokemon that are cheaper in their tier get a weight boost. * 1 cost mons get 2x * 2 cost mons get 1.5x * 4, 6, 8 cost mons get 1.75x @@ -433,11 +438,7 @@ export class Egg { for (const speciesId of speciesPool) { // Accounts for species that have starter costs outside of the normal range for their EggTier const speciesCostClamped = Phaser.Math.Clamp(speciesStarterCosts[speciesId], minStarterValue, maxStarterValue); - let weight = Math.floor((((maxStarterValue - speciesCostClamped) / ((maxStarterValue - minStarterValue) + 1)) * 1.5 + 1) * 100); - const species = getPokemonSpecies(speciesId); - if (species.isRegional()) { - weight = Math.floor(weight / 2); - } + const weight = Math.floor((((maxStarterValue - speciesCostClamped) / ((maxStarterValue - minStarterValue) + 1)) * 1.5 + 1) * 100); speciesWeights.push(totalWeight + weight); totalWeight += weight; } diff --git a/src/data/move.ts b/src/data/move.ts index 2ac4d74b712..5a8ad208467 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1385,14 +1385,38 @@ export class UserHpDamageAttr extends FixedDamageAttr { } export class TargetHalfHpDamageAttr extends FixedDamageAttr { + // the initial amount of hp the target had before the first hit + // used for multi lens + private initialHp: number; constructor() { super(0); } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - (args[0] as Utils.IntegerHolder).value = Utils.toDmgValue(target.hp / 2); + // first, determine if the hit is coming from multi lens or not + const lensCount = user.getHeldItems().find(i => i instanceof PokemonMultiHitModifier)?.getStackCount() ?? 0; + if (lensCount <= 0) { + // no multi lenses; we can just halve the target's hp and call it a day + (args[0] as Utils.NumberHolder).value = Utils.toDmgValue(target.hp / 2); + return true; + } - return true; + // figure out what hit # we're on + switch (user.turnData.hitCount - user.turnData.hitsLeft) { + case 0: + // first hit of move; update initialHp tracker + this.initialHp = target.hp; + default: + // multi lens added hit; use initialHp tracker to ensure correct damage + (args[0] as Utils.NumberHolder).value = Utils.toDmgValue(this.initialHp / 2); + return true; + break; + case lensCount + 1: + // parental bond added hit; calc damage as normal + (args[0] as Utils.NumberHolder).value = Utils.toDmgValue(target.hp / 2); + return true; + break; + } } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { @@ -1843,7 +1867,7 @@ export class FlameBurstAttr extends MoveEffectAttr { applyAbAttrs(BlockNonDirectDamageAbAttr, targetAlly, cancelled); } - if (cancelled.value || !targetAlly) { + if (cancelled.value || !targetAlly || targetAlly.switchOutStatus) { return false; } @@ -5967,50 +5991,113 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { * Check if Wimp Out/Emergency Exit activates due to being hit by U-turn or Volt Switch * If it did, the user of U-turn or Volt Switch will not be switched out. */ - if (target.getAbility().hasAttr(PostDamageForceSwitchAbAttr) && - (move.id === Moves.U_TURN || move.id === Moves.VOLT_SWITCH || move.id === Moves.FLIP_TURN) + if (target.getAbility().hasAttr(PostDamageForceSwitchAbAttr) + && [ Moves.U_TURN, Moves.VOLT_SWITCH, Moves.FLIP_TURN ].includes(move.id) ) { if (this.hpDroppedBelowHalf(target)) { return false; } } - // Switch out logic for the player's Pokemon - if (switchOutTarget.scene.getPlayerParty().filter((p) => p.isAllowedInBattle() && !p.isOnField()).length < 1) { + + // Find indices of off-field Pokemon that are eligible to be switched into + const eligibleNewIndices: number[] = []; + switchOutTarget.scene.getPlayerParty().forEach((pokemon, index) => { + if (pokemon.isAllowedInBattle() && !pokemon.isOnField()) { + eligibleNewIndices.push(index); + } + }); + + if (eligibleNewIndices.length < 1) { return false; } if (switchOutTarget.hp > 0) { - switchOutTarget.leaveField(this.switchType === SwitchType.SWITCH); - user.scene.prependToPhase(new SwitchPhase(user.scene, this.switchType, switchOutTarget.getFieldIndex(), true, true), MoveEndPhase); - return true; + if (this.switchType === SwitchType.FORCE_SWITCH) { + switchOutTarget.leaveField(true); + const slotIndex = eligibleNewIndices[user.randSeedInt(eligibleNewIndices.length)]; + user.scene.prependToPhase( + new SwitchSummonPhase( + user.scene, + this.switchType, + switchOutTarget.getFieldIndex(), + slotIndex, + false, + true + ), + MoveEndPhase + ); + } else { + switchOutTarget.leaveField(this.switchType === SwitchType.SWITCH); + user.scene.prependToPhase( + new SwitchPhase( + user.scene, + this.switchType, + switchOutTarget.getFieldIndex(), + true, + true + ), + MoveEndPhase + ); + return true; + } } return false; - } else if (user.scene.currentBattle.battleType !== BattleType.WILD) { - // Switch out logic for trainer battles - if (switchOutTarget.scene.getEnemyParty().filter((p) => p.isAllowedInBattle() && !p.isOnField()).length < 1) { + } else if (user.scene.currentBattle.battleType !== BattleType.WILD) { // Switch out logic for enemy trainers + // Find indices of off-field Pokemon that are eligible to be switched into + const eligibleNewIndices: number[] = []; + switchOutTarget.scene.getEnemyParty().forEach((pokemon, index) => { + if (pokemon.isAllowedInBattle() && !pokemon.isOnField()) { + eligibleNewIndices.push(index); + } + }); + + if (eligibleNewIndices.length < 1) { return false; } if (switchOutTarget.hp > 0) { - // for opponent switching out - switchOutTarget.leaveField(this.switchType === SwitchType.SWITCH); - user.scene.prependToPhase(new SwitchSummonPhase(user.scene, this.switchType, switchOutTarget.getFieldIndex(), - (user.scene.currentBattle.trainer ? user.scene.currentBattle.trainer.getNextSummonIndex((switchOutTarget as EnemyPokemon).trainerSlot) : 0), - false, false), MoveEndPhase); + if (this.switchType === SwitchType.FORCE_SWITCH) { + switchOutTarget.leaveField(true); + const slotIndex = eligibleNewIndices[user.randSeedInt(eligibleNewIndices.length)]; + user.scene.prependToPhase( + new SwitchSummonPhase( + user.scene, + this.switchType, + switchOutTarget.getFieldIndex(), + slotIndex, + false, + false + ), + MoveEndPhase + ); + } else { + switchOutTarget.leaveField(this.switchType === SwitchType.SWITCH); + user.scene.prependToPhase( + new SwitchSummonPhase( + user.scene, + this.switchType, + switchOutTarget.getFieldIndex(), + (user.scene.currentBattle.trainer ? user.scene.currentBattle.trainer.getNextSummonIndex((switchOutTarget as EnemyPokemon).trainerSlot) : 0), + false, + false + ), + MoveEndPhase + ); + } } - } else { + } else { // Switch out logic for wild pokemon /** * Check if Wimp Out/Emergency Exit activates due to being hit by U-turn or Volt Switch * If it did, the user of U-turn or Volt Switch will not be switched out. */ - if (target.getAbility().hasAttr(PostDamageForceSwitchAbAttr) && - (move.id === Moves.U_TURN || move.id === Moves.VOLT_SWITCH) || move.id === Moves.FLIP_TURN) { + if (target.getAbility().hasAttr(PostDamageForceSwitchAbAttr) + && [ Moves.U_TURN, Moves.VOLT_SWITCH, Moves.FLIP_TURN ].includes(move.id) + ) { if (this.hpDroppedBelowHalf(target)) { return false; } } - // Switch out logic for everything else (eg: WILD battles) if (user.scene.currentBattle.waveIndex % 10 === 0) { return false; } @@ -6035,7 +6122,7 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { user.scene.clearEnemyHeldItemModifiers(); if (switchOutTarget.hp) { - user.scene.pushPhase(new BattleEndPhase(user.scene)); + user.scene.pushPhase(new BattleEndPhase(user.scene, false)); user.scene.pushPhase(new NewBattlePhase(user.scene)); } } @@ -6641,6 +6728,126 @@ export class CopyMoveAttr extends OverrideMoveEffectAttr { } } +/** + * Attribute used for moves that causes the target to repeat their last used move. + * + * Used for [Instruct](https://bulbapedia.bulbagarden.net/wiki/Instruct_(move)). +*/ +export class RepeatMoveAttr extends MoveEffectAttr { + constructor() { + super(false, { trigger: MoveEffectTrigger.POST_APPLY }); // needed to ensure correct protect interaction + } + + /** + * Forces the target to re-use their last used move again + * + * @param user {@linkcode Pokemon} that used the attack + * @param target {@linkcode Pokemon} targeted by the attack + * @param move N/A + * @param args N/A + * @returns `true` if the move succeeds + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + // get the last move used (excluding status based failures) as well as the corresponding moveset slot + const lastMove = target.getLastXMoves(-1).find(m => m.move !== Moves.NONE)!; + const movesetMove = target.getMoveset().find(m => m?.moveId === lastMove.move)!; + const moveTargets = lastMove.targets ?? []; + + user.scene.queueMessage(i18next.t("moveTriggers:instructingMove", { + userPokemonName: getPokemonNameWithAffix(user), + targetPokemonName: getPokemonNameWithAffix(target) + })); + target.getMoveQueue().unshift({ move: lastMove.move, targets: moveTargets, ignorePP: false }); + target.turnData.extraTurns++; + target.scene.appendToPhase(new MovePhase(target.scene, target, moveTargets, movesetMove), MoveEndPhase); + return true; + } + + getCondition(): MoveConditionFunc { + return (user, target, move) => { + // TODO: Confirm behavior of instructing move known by target but called by another move + const lastMove = target.getLastXMoves(-1).find(m => m.move !== Moves.NONE); + const movesetMove = target.getMoveset().find(m => m?.moveId === lastMove?.move); + const moveTargets = lastMove?.targets ?? []; + // TODO: Add a way of adding moves to list procedurally rather than a pre-defined blacklist + const unrepeatablemoves = [ + // Locking/Continually Executed moves + Moves.OUTRAGE, + Moves.RAGING_FURY, + Moves.ROLLOUT, + Moves.PETAL_DANCE, + Moves.THRASH, + Moves.ICE_BALL, + // Multi-turn Moves + Moves.BIDE, + Moves.SHELL_TRAP, + Moves.BEAK_BLAST, + Moves.FOCUS_PUNCH, + // "First Turn Only" moves + Moves.FAKE_OUT, + Moves.FIRST_IMPRESSION, + Moves.MAT_BLOCK, + // Moves with a recharge turn + Moves.HYPER_BEAM, + Moves.ETERNABEAM, + Moves.FRENZY_PLANT, + Moves.BLAST_BURN, + Moves.HYDRO_CANNON, + Moves.GIGA_IMPACT, + Moves.PRISMATIC_LASER, + Moves.ROAR_OF_TIME, + Moves.ROCK_WRECKER, + Moves.METEOR_ASSAULT, + // Charging & 2-turn moves + Moves.DIG, + Moves.FLY, + Moves.BOUNCE, + Moves.SHADOW_FORCE, + Moves.PHANTOM_FORCE, + Moves.DIVE, + Moves.ELECTRO_SHOT, + Moves.ICE_BURN, + Moves.GEOMANCY, + Moves.FREEZE_SHOCK, + Moves.SKY_DROP, + Moves.SKY_ATTACK, + Moves.SKULL_BASH, + Moves.SOLAR_BEAM, + Moves.SOLAR_BLADE, + Moves.METEOR_BEAM, + // Other moves + Moves.INSTRUCT, + Moves.KINGS_SHIELD, + Moves.SKETCH, + Moves.TRANSFORM, + Moves.MIMIC, + Moves.STRUGGLE, + // TODO: Add Max/G-Move blockage if or when they are implemented + ]; + + if (!movesetMove // called move not in target's moveset (dancer, forgetting the move, etc.) + || movesetMove.ppUsed === movesetMove.getMovePp() // move out of pp + || allMoves[lastMove?.move ?? Moves.NONE].isChargingMove() // called move is a charging/recharging move + || !moveTargets.length // called move has no targets + || unrepeatablemoves.includes(lastMove?.move ?? Moves.NONE)) { // called move is explicitly in the banlist + return false; + } + return true; + }; + } + + getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + // TODO: Make the AI acutally use instruct + /* Ideally, the AI would score instruct based on the scorings of the on-field pokemons' + * last used moves at the time of using Instruct (by the time the instructor gets to act) + * with respect to the user's side. + * In 99.9% of cases, this would be the pokemon's ally (unless the target had last + * used a move like Decorate on the user or its ally) + */ + return 2; + } +} + /** * Attribute used for moves that reduce PP of the target's last used move. * Used for Spite. @@ -7454,6 +7661,8 @@ const failIfLastInPartyCondition: MoveConditionFunc = (user: Pokemon, target: Po return party.some(pokemon => pokemon.isActive() && !pokemon.isOnField()); }; +const failIfGhostTypeCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => !target.isOfType(Type.GHOST); + export type MoveAttrFilter = (attr: MoveAttr) => boolean; function applyMoveAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon | null, target: Pokemon | null, move: Move, args: any[]): Promise { @@ -7777,11 +7986,10 @@ export function initMoves() { .windMove(), new AttackMove(Moves.WING_ATTACK, Type.FLYING, MoveCategory.PHYSICAL, 60, 100, 35, -1, 0, 1), new StatusMove(Moves.WHIRLWIND, Type.NORMAL, -1, 20, -1, -6, 1) - .attr(ForceSwitchOutAttr) + .attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH) .ignoresSubstitute() .hidesTarget() - .windMove() - .partial(), // Should force random switches + .windMove(), new ChargingAttackMove(Moves.FLY, Type.FLYING, MoveCategory.PHYSICAL, 90, 95, 15, -1, 0, 1) .chargeText(i18next.t("moveTriggers:flewUpHigh", { pokemonName: "{USER}" })) .chargeAttr(SemiInvulnerableAttr, BattlerTagType.FLYING) @@ -7857,10 +8065,9 @@ export function initMoves() { .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES), new StatusMove(Moves.ROAR, Type.NORMAL, -1, 20, -1, -6, 1) - .attr(ForceSwitchOutAttr) + .attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH) .soundBased() - .hidesTarget() - .partial(), // Should force random switching + .hidesTarget(), new StatusMove(Moves.SING, Type.NORMAL, 55, 15, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP) .soundBased(), @@ -8202,6 +8409,7 @@ export function initMoves() { new AttackMove(Moves.THIEF, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 25, -1, 0, 2) .attr(StealHeldItemChanceAttr, 0.3), new StatusMove(Moves.SPIDER_WEB, Type.BUG, -1, 10, -1, 0, 2) + .condition(failIfGhostTypeCondition) .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1), new StatusMove(Moves.MIND_READER, Type.NORMAL, -1, 5, -1, 0, 2) .attr(IgnoreAccuracyAttr), @@ -8338,6 +8546,7 @@ export function initMoves() { new AttackMove(Moves.STEEL_WING, Type.STEEL, MoveCategory.PHYSICAL, 70, 90, 25, 10, 0, 2) .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true), new StatusMove(Moves.MEAN_LOOK, Type.NORMAL, -1, 5, -1, 0, 2) + .condition(failIfGhostTypeCondition) .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1), new StatusMove(Moves.ATTRACT, Type.NORMAL, 100, 15, -1, 0, 2) .attr(AddBattlerTagAttr, BattlerTagType.INFATUATED) @@ -8457,7 +8666,7 @@ export function initMoves() { .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1) .ballBombMove(), new AttackMove(Moves.FUTURE_SIGHT, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 2) - .partial() // cannot be used on multiple Pokemon on the same side in a double battle, hits immediately when called by Metronome/etc + .partial() // cannot be used on multiple Pokemon on the same side in a double battle, hits immediately when called by Metronome/etc, should not apply abilities or held items if user is off the field .ignoresProtect() .attr(DelayedAttackAttr, ArenaTagType.FUTURE_SIGHT, ChargeAnim.FUTURE_SIGHT_CHARGING, i18next.t("moveTriggers:foresawAnAttack", { pokemonName: "{USER}" })), new AttackMove(Moves.ROCK_SMASH, Type.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 15, 50, 0, 2) @@ -8717,6 +8926,7 @@ export function initMoves() { new SelfStatusMove(Moves.IRON_DEFENSE, Type.STEEL, -1, 15, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true), new StatusMove(Moves.BLOCK, Type.NORMAL, -1, 5, -1, 0, 3) + .condition(failIfGhostTypeCondition) .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1), new StatusMove(Moves.HOWL, Type.NORMAL, -1, 40, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK ], 1) @@ -8766,7 +8976,7 @@ export function initMoves() { .attr(ConfuseAttr) .pulseMove(), new AttackMove(Moves.DOOM_DESIRE, Type.STEEL, MoveCategory.SPECIAL, 140, 100, 5, -1, 0, 3) - .partial() // cannot be used on multiple Pokemon on the same side in a double battle, hits immediately when called by Metronome/etc + .partial() // cannot be used on multiple Pokemon on the same side in a double battle, hits immediately when called by Metronome/etc, should not apply abilities or held items if user is off the field .ignoresProtect() .attr(DelayedAttackAttr, ArenaTagType.DOOM_DESIRE, ChargeAnim.DOOM_DESIRE_CHARGING, i18next.t("moveTriggers:choseDoomDesireAsDestiny", { pokemonName: "{USER}" })), new AttackMove(Moves.PSYCHO_BOOST, Type.PSYCHIC, MoveCategory.SPECIAL, 140, 90, 5, -1, 0, 3) @@ -9222,8 +9432,8 @@ export function initMoves() { .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true) .attr(StatStageChangeAttr, [ Stat.SPD ], 2, true), new AttackMove(Moves.CIRCLE_THROW, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 90, 10, -1, -6, 5) - .attr(ForceSwitchOutAttr) - .partial(), // Should force random switches + .attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH) + .hidesTarget(), new AttackMove(Moves.INCINERATE, Type.FIRE, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 5) .target(MoveTarget.ALL_NEAR_ENEMIES) .attr(RemoveHeldItemAttr, true), @@ -9291,9 +9501,8 @@ export function initMoves() { new AttackMove(Moves.FROST_BREATH, Type.ICE, MoveCategory.SPECIAL, 60, 90, 10, 100, 0, 5) .attr(CritOnlyAttr), new AttackMove(Moves.DRAGON_TAIL, Type.DRAGON, MoveCategory.PHYSICAL, 60, 90, 10, -1, -6, 5) - .attr(ForceSwitchOutAttr) - .hidesTarget() - .partial(), // Should force random switches + .attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH) + .hidesTarget(), new SelfStatusMove(Moves.WORK_UP, Type.NORMAL, -1, 30, -1, 0, 5) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, true), new AttackMove(Moves.ELECTROWEB, Type.ELECTRIC, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 5) @@ -9523,9 +9732,9 @@ export function initMoves() { .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK, Stat.SPD ], -1, false, { condition: (user, target, move) => target.status?.effect === StatusEffect.POISON || target.status?.effect === StatusEffect.TOXIC }) .target(MoveTarget.ALL_NEAR_ENEMIES), new StatusMove(Moves.POWDER, Type.BUG, 100, 20, -1, 1, 6) + .attr(AddBattlerTagAttr, BattlerTagType.POWDER, false, true) .ignoresSubstitute() - .powderMove() - .unimplemented(), + .powderMove(), new ChargingSelfStatusMove(Moves.GEOMANCY, Type.FAIRY, -1, 10, -1, 0, 6) .chargeText(i18next.t("moveTriggers:isChargingPower", { pokemonName: "{USER}" })) .attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF, Stat.SPD ], 2, true) @@ -9803,7 +10012,8 @@ export function initMoves() { .attr(StatStageChangeAttr, [ Stat.ATK ], -1), new StatusMove(Moves.INSTRUCT, Type.PSYCHIC, -1, 15, -1, 0, 7) .ignoresSubstitute() - .unimplemented(), + .attr(RepeatMoveAttr) + .edgeCase(), // incorrect interactions with Gigaton Hammer, Blood Moon & Torment new AttackMove(Moves.BEAK_BLAST, Type.FLYING, MoveCategory.PHYSICAL, 100, 100, 15, -1, -3, 7) .attr(BeakBlastHeaderAttr) .ballBombMove() @@ -10012,6 +10222,7 @@ export function initMoves() { .attr(EatBerryAttr) .target(MoveTarget.ALL), new StatusMove(Moves.OCTOLOCK, Type.FIGHTING, 100, 15, -1, 0, 8) + .condition(failIfGhostTypeCondition) .attr(AddBattlerTagAttr, BattlerTagType.OCTOLOCK, false, true, 1), new AttackMove(Moves.BOLT_BEAK, Type.ELECTRIC, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 8) .attr(FirstAttackDoublePowerAttr), @@ -10554,6 +10765,7 @@ export function initMoves() { new AttackMove(Moves.TWIN_BEAM, Type.PSYCHIC, MoveCategory.SPECIAL, 40, 100, 10, -1, 0, 9) .attr(MultiHitAttr, MultiHitType._2), new AttackMove(Moves.RAGE_FIST, Type.GHOST, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 9) + .partial() // Counter resets every wave instead of on arena reset .attr(HitCountPowerAttr) .punchingMove(), new AttackMove(Moves.ARMOR_CANNON, Type.FIRE, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9) diff --git a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts index 9c00148fbac..6b0f239d28d 100644 --- a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts +++ b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts @@ -216,6 +216,7 @@ export const AbsoluteAvariceEncounter: MysteryEncounter = species: getPokemonSpecies(Species.GREEDENT), isBoss: true, bossSegments: 3, + shiny: false, // Shiny lock because of consistency issues between the different options moveSet: [ Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.CRUNCH ], modifierConfigs: bossModifierConfigs, tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], @@ -353,9 +354,9 @@ export const AbsoluteAvariceEncounter: MysteryEncounter = }) .withOptionPhase(async (scene: BattleScene) => { // Let it have the food - // Greedent joins the team, level equal to 2 below highest party member + // Greedent joins the team, level equal to 2 below highest party member (shiny locked) const level = getHighestLevelPlayerPokemon(scene, false, true).level - 2; - const greedent = new EnemyPokemon(scene, getPokemonSpecies(Species.GREEDENT), level, TrainerSlot.NONE, false); + const greedent = new EnemyPokemon(scene, getPokemonSpecies(Species.GREEDENT), level, TrainerSlot.NONE, false, true); greedent.moveset = [ new PokemonMove(Moves.THRASH), new PokemonMove(Moves.BODY_PRESS), new PokemonMove(Moves.STUFF_CHEEKS), new PokemonMove(Moves.SLACK_OFF) ]; greedent.passive = true; diff --git a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts index 5524511c67b..786ca3e8fc0 100644 --- a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts +++ b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts @@ -98,7 +98,9 @@ export const BerriesAboundEncounter: MysteryEncounter = tint: 0.25, x: -5, repeat: true, - isPokemon: true + isPokemon: true, + isShiny: bossPokemon.shiny, + variant: bossPokemon.variant } ]; diff --git a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts index ae6cabd4dae..6bd6856604b 100644 --- a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts +++ b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts @@ -276,6 +276,8 @@ export const ClowningAroundEncounter: MysteryEncounter = generateItemsOfTier(scene, mostHeldItemsPokemon, numBerries, "Berries"); // Shuffle Transferable held items in the same tier (only shuffles Ultra and Rogue atm) + // For the purpose of this ME, Soothe Bells and Lucky Eggs are counted as Ultra tier + // And Golden Eggs as Rogue tier let numUltra = 0; let numRogue = 0; items.filter(m => m.isTransferable && !(m instanceof BerryModifier)) @@ -285,7 +287,7 @@ export const ClowningAroundEncounter: MysteryEncounter = if (type.id === "GOLDEN_EGG" || tier === ModifierTier.ROGUE) { numRogue += m.stackCount; scene.removeModifier(m); - } else if (type.id === "LUCKY_EGG" || tier === ModifierTier.ULTRA) { + } else if (type.id === "LUCKY_EGG" || type.id === "SOOTHE_BELL" || tier === ModifierTier.ULTRA) { numUltra += m.stackCount; scene.removeModifier(m); } @@ -456,7 +458,6 @@ function generateItemsOfTier(scene: BattleScene, pokemon: PlayerPokemon, numItem [ modifierTypes.LEFTOVERS, 4 ], [ modifierTypes.SHELL_BELL, 4 ], [ modifierTypes.SOUL_DEW, 10 ], - [ modifierTypes.SOOTHE_BELL, 3 ], [ modifierTypes.SCOPE_LENS, 1 ], [ modifierTypes.BATON, 1 ], [ modifierTypes.FOCUS_BAND, 5 ], diff --git a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts index bae5a8790e9..841aadd7c36 100644 --- a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts +++ b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts @@ -92,9 +92,13 @@ export const DancingLessonsEncounter: MysteryEncounter = .withCatchAllowed(true) .withFleeAllowed(false) .withOnVisualsStart((scene: BattleScene) => { - const danceAnim = new EncounterBattleAnim(EncounterAnim.DANCE, scene.getEnemyPokemon()!, scene.getPlayerPokemon()!); - danceAnim.play(scene); - + const oricorio = scene.getEnemyPokemon()!; + const danceAnim = new EncounterBattleAnim(EncounterAnim.DANCE, oricorio, scene.getPlayerPokemon()!); + danceAnim.play(scene, false, () => { + if (oricorio.shiny) { + oricorio.sparkle(); + } + }); return true; }) .withIntroDialogue([ @@ -136,7 +140,7 @@ export const DancingLessonsEncounter: MysteryEncounter = } const oricorioData = new PokemonData(enemyPokemon); - const oricorio = scene.addEnemyPokemon(species, level, TrainerSlot.NONE, false, oricorioData); + const oricorio = scene.addEnemyPokemon(species, level, TrainerSlot.NONE, false, false, oricorioData); // Adds a real Pokemon sprite to the field (required for the animation) scene.getEnemyParty().forEach(enemyPokemon => { diff --git a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts index 2b801d70f61..05d6501f256 100644 --- a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts +++ b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts @@ -8,7 +8,7 @@ import { getPokemonSpecies } from "#app/data/pokemon-species"; import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { EnemyPartyConfig, EnemyPokemonConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, } from "../utils/encounter-phase-utils"; -import { getRandomPlayerPokemon, getRandomSpeciesByStarterTier } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { getRandomPlayerPokemon, getRandomSpeciesByStarterCost } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { ModifierRewardPhase } from "#app/phases/modifier-reward-phase"; @@ -174,7 +174,7 @@ export const DarkDealEncounter: MysteryEncounter = const roll = randSeedInt(100); const starterTier: number | [number, number] = roll >= 65 ? 6 : roll >= 15 ? 7 : roll >= 5 ? 8 : [ 9, 10 ]; - const bossSpecies = getPokemonSpecies(getRandomSpeciesByStarterTier(starterTier, excludedBosses, bossTypes)); + const bossSpecies = getPokemonSpecies(getRandomSpeciesByStarterCost(starterTier, excludedBosses, bossTypes)); const pokemonConfig: EnemyPokemonConfig = { species: bossSpecies, isBoss: true, diff --git a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts index 3f9030dc3b2..3533e10df29 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -114,7 +114,9 @@ export const FightOrFlightEncounter: MysteryEncounter = tint: 0.25, x: -5, repeat: true, - isPokemon: true + isPokemon: true, + isShiny: bossPokemon.shiny, + variant: bossPokemon.variant }, ]; diff --git a/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts b/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts index c286fffe0de..84c3e56a836 100644 --- a/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts +++ b/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts @@ -194,10 +194,10 @@ async function summonPlayerPokemon(scene: BattleScene) { playerAnimationPromise = summonPlayerPokemonAnimation(scene, playerPokemon); }); - // Also loads Wobbuffet data + // Also loads Wobbuffet data (cannot be shiny) const enemySpecies = getPokemonSpecies(Species.WOBBUFFET); scene.currentBattle.enemyParty = []; - const wobbuffet = scene.addEnemyPokemon(enemySpecies, encounter.misc.playerPokemon.level, TrainerSlot.NONE, false); + const wobbuffet = scene.addEnemyPokemon(enemySpecies, encounter.misc.playerPokemon.level, TrainerSlot.NONE, false, true); wobbuffet.ivs = [ 0, 0, 0, 0, 0, 0 ]; wobbuffet.setNature(Nature.MILD); wobbuffet.setAlpha(0); diff --git a/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts b/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts index 2d569621449..fa445d75d4f 100644 --- a/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts +++ b/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts @@ -12,8 +12,7 @@ import PokemonSpecies, { allSpecies, getPokemonSpecies } from "#app/data/pokemon import { getTypeRgb } from "#app/data/type"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import * as Utils from "#app/utils"; -import { IntegerHolder, isNullOrUndefined, randInt, randSeedInt, randSeedShuffle } from "#app/utils"; +import { NumberHolder, isNullOrUndefined, randInt, randSeedInt, randSeedShuffle } from "#app/utils"; import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { HiddenAbilityRateBoosterModifier, PokemonFormChangeItemModifier, PokemonHeldItemModifier, ShinyRateBoosterModifier, SpeciesStatBoosterModifier } from "#app/modifier/modifier"; import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; @@ -27,6 +26,7 @@ import { trainerNamePools } from "#app/data/trainer-names"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import { addPokemonDataToDexAndValidateAchievements } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import type { PokeballType } from "#enums/pokeball"; +import { doShinySparkleAnim } from "#app/field/anims"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounters/globalTradeSystem"; @@ -230,7 +230,7 @@ export const GlobalTradeSystemEncounter: MysteryEncounter = const tradePokemon = new EnemyPokemon(scene, randomTradeOption, pokemon.level, TrainerSlot.NONE, false); // Extra shiny roll at 1/128 odds (boosted by events and charms) if (!tradePokemon.shiny) { - const shinyThreshold = new Utils.IntegerHolder(WONDER_TRADE_SHINY_CHANCE); + const shinyThreshold = new NumberHolder(WONDER_TRADE_SHINY_CHANCE); if (scene.eventManager.isEventActive()) { shinyThreshold.value *= scene.eventManager.getShinyMultiplier(); } @@ -247,7 +247,7 @@ export const GlobalTradeSystemEncounter: MysteryEncounter = const hiddenIndex = tradePokemon.species.ability2 ? 2 : 1; if (tradePokemon.species.abilityHidden) { if (tradePokemon.abilityIndex < hiddenIndex) { - const hiddenAbilityChance = new IntegerHolder(64); + const hiddenAbilityChance = new NumberHolder(64); scene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); const hasHiddenAbility = !randSeedInt(hiddenAbilityChance.value); @@ -582,7 +582,13 @@ function doPokemonTradeSequence(scene: BattleScene, tradedPokemon: PlayerPokemon receivedPokemonTintSprite.setTintFill(getPokeballTintColor(receivedPokemon.pokeball)); [ tradedPokemonSprite, tradedPokemonTintSprite ].map(sprite => { - sprite.play(tradedPokemon.getSpriteKey(true)); + const spriteKey = tradedPokemon.getSpriteKey(true); + try { + sprite.play(spriteKey); + } catch (err: unknown) { + console.error(`Failed to play animation for ${spriteKey}`, err); + } + sprite.setPipeline(scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(tradedPokemon.getTeraType()) }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", tradedPokemon.getSpriteKey()); @@ -597,7 +603,13 @@ function doPokemonTradeSequence(scene: BattleScene, tradedPokemon: PlayerPokemon }); [ receivedPokemonSprite, receivedPokemonTintSprite ].map(sprite => { - sprite.play(receivedPokemon.getSpriteKey(true)); + const spriteKey = receivedPokemon.getSpriteKey(true); + try { + sprite.play(spriteKey); + } catch (err: unknown) { + console.error(`Failed to play animation for ${spriteKey}`, err); + } + sprite.setPipeline(scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(tradedPokemon.getTeraType()) }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", receivedPokemon.getSpriteKey()); @@ -797,6 +809,14 @@ function doTradeReceivedSequence(scene: BattleScene, receivedPokemon: PlayerPoke receivedPokeballSprite.x = tradeBaseBg.displayWidth / 2; receivedPokeballSprite.y = tradeBaseBg.displayHeight / 2 - 100; + // Received pokemon sparkles + let pokemonShinySparkle: Phaser.GameObjects.Sprite; + if (receivedPokemon.shiny) { + pokemonShinySparkle = scene.add.sprite(receivedPokemonSprite.x, receivedPokemonSprite.y, "shiny"); + pokemonShinySparkle.setVisible(false); + tradeContainer.add(pokemonShinySparkle); + } + const BASE_ANIM_DURATION = 1000; // Pokeball falls to the screen @@ -835,6 +855,11 @@ function doTradeReceivedSequence(scene: BattleScene, receivedPokemon: PlayerPoke scale: 1, alpha: 0, onComplete: () => { + if (receivedPokemon.shiny) { + scene.time.delayedCall(500, () => { + doShinySparkleAnim(scene, pokemonShinySparkle, receivedPokemon.variant); + }); + } receivedPokeballSprite.destroy(); scene.time.delayedCall(2000, () => resolve()); } diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index ab6517e97af..877deee66b7 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -34,6 +34,7 @@ export const MysteriousChestEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.MYSTERIOUS_CHEST) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + .withScenePartySizeRequirement(2, 6, true) .withAutoHideIntroVisuals(false) .withCatchAllowed(true) .withIntroSpriteConfigs([ diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index 0353d52a592..e16cf2d6973 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -9,9 +9,9 @@ import { EnemyPokemon } from "#app/field/pokemon"; import { PokeballType } from "#enums/pokeball"; import { PlayerGender } from "#enums/player-gender"; import { IntegerHolder, randSeedInt } from "#app/utils"; -import { getPokemonSpecies } from "#app/data/pokemon-species"; +import PokemonSpecies, { getPokemonSpecies } from "#app/data/pokemon-species"; import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; -import { doPlayerFlee, doPokemonFlee, getRandomSpeciesByStarterTier, trainerThrowPokeball } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { doPlayerFlee, doPokemonFlee, getRandomSpeciesByStarterCost, trainerThrowPokeball } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { getEncounterText, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { getPokemonNameWithAffix } from "#app/messages"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; @@ -19,6 +19,7 @@ import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode import { ScanIvsPhase } from "#app/phases/scan-ivs-phase"; import { SummonPhase } from "#app/phases/summon-phase"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; +import { NON_LEGEND_PARADOX_POKEMON } from "#app/data/balance/special-species-groups"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounters/safariZone"; @@ -261,7 +262,7 @@ async function summonSafariPokemon(scene: BattleScene) { let enemySpecies; let pokemon; scene.executeWithSeedOffset(() => { - enemySpecies = getPokemonSpecies(getRandomSpeciesByStarterTier([ 0, 5 ], undefined, undefined, false, false, false)); + enemySpecies = getSafariSpeciesSpawn(); const level = scene.currentBattle.getLevelForWave(); enemySpecies = getPokemonSpecies(enemySpecies.getWildSpeciesForLevel(level, true, false, scene.gameMode)); pokemon = scene.addEnemyPokemon(enemySpecies, level, TrainerSlot.NONE, false); @@ -526,3 +527,10 @@ async function doEndTurn(scene: BattleScene, cursorIndex: number) { initSubsequentOptionSelect(scene, { overrideOptions: safariZoneGameOptions, startingCursorIndex: cursorIndex, hideDescription: true }); } } + +/** + * @returns A random species that has at most 5 starter cost and is not Mythical, Paradox, etc. + */ +export function getSafariSpeciesSpawn(): PokemonSpecies { + return getPokemonSpecies(getRandomSpeciesByStarterCost([ 0, 5 ], NON_LEGEND_PARADOX_POKEMON, undefined, false, false, false)); +} diff --git a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts index 3fb502be545..8dd03e12caa 100644 --- a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts @@ -60,6 +60,7 @@ export const SlumberingSnorlaxEncounter: MysteryEncounter = const pokemonConfig: EnemyPokemonConfig = { species: bossSpecies, isBoss: true, + shiny: false, // Shiny lock because shiny is rolled only if the battle option is picked status: [ StatusEffect.SLEEP, 5 ], // Extra turns on timer for Snorlax's start of fight moves moveSet: [ Moves.REST, Moves.SLEEP_TALK, Moves.CRUNCH, Moves.GIGA_IMPACT ], modifierConfigs: [ diff --git a/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts b/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts index 6a4c6592fda..5ac9852f27a 100644 --- a/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts @@ -21,7 +21,6 @@ import { EggSourceType } from "#enums/egg-source-types"; import { EggTier } from "#enums/egg-type"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import { achvs } from "#app/system/achv"; import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { Type } from "#enums/type"; import { getPokeballTintColor } from "#app/data/pokeball"; @@ -520,12 +519,6 @@ function removePokemonFromPartyAndStoreHeldItems(scene: BattleScene, encounter: ]; } -function checkAchievement(scene: BattleScene) { - if (scene.arena.biomeType === Biome.SPACE) { - scene.validateAchv(achvs.BREEDERS_IN_SPACE); - } -} - function restorePartyAndHeldItems(scene: BattleScene) { const encounter = scene.currentBattle.mysteryEncounter!; // Restore original party @@ -617,8 +610,6 @@ function onGameOver(scene: BattleScene) { function doPostEncounterCleanup(scene: BattleScene) { const encounter = scene.currentBattle.mysteryEncounter!; if (!encounter.misc.encounterFailed) { - // Give achievement if in Space biome - checkAchievement(scene); // Give 20 friendship to the chosen pokemon encounter.misc.chosenPokemon.addFriendship(FRIENDSHIP_ADDED); restorePartyAndHeldItems(scene); diff --git a/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts b/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts index 77d92e3749e..feb6e68d1d1 100644 --- a/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts @@ -4,8 +4,8 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; -import { catchPokemon, getRandomSpeciesByStarterTier, getSpriteKeysFromPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; -import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { catchPokemon, getRandomSpeciesByStarterCost, getSpriteKeysFromPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import PokemonSpecies, { getPokemonSpecies } from "#app/data/pokemon-species"; import { speciesStarterCosts } from "#app/data/balance/starters"; import { Species } from "#enums/species"; import { PokeballType } from "#enums/pokeball"; @@ -17,6 +17,7 @@ import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import { Abilities } from "#enums/abilities"; +import { NON_LEGEND_PARADOX_POKEMON } from "#app/data/balance/special-species-groups"; /** the i18n namespace for this encounter */ const namespace = "mysteryEncounters/thePokemonSalesman"; @@ -60,24 +61,22 @@ export const ThePokemonSalesmanEncounter: MysteryEncounter = .withOnInit((scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter!; - let species = getPokemonSpecies(getRandomSpeciesByStarterTier([ 0, 5 ], undefined, undefined, false, false, false)); + let species = getSalesmanSpeciesOffer(); let tries = 0; // Reroll any species that don't have HAs while ((isNullOrUndefined(species.abilityHidden) || species.abilityHidden === Abilities.NONE) && tries < 5) { - species = getPokemonSpecies(getRandomSpeciesByStarterTier([ 0, 5 ], undefined, undefined, false, false, false)); + species = getSalesmanSpeciesOffer(); tries++; } let pokemon: PlayerPokemon; if (randSeedInt(SHINY_MAGIKARP_WEIGHT) === 0 || isNullOrUndefined(species.abilityHidden) || species.abilityHidden === Abilities.NONE) { - // If no HA mon found or you roll 1%, give shiny Magikarp + // If no HA mon found or you roll 1%, give shiny Magikarp with random variant species = getPokemonSpecies(Species.MAGIKARP); - const hiddenIndex = species.ability2 ? 2 : 1; - pokemon = new PlayerPokemon(scene, species, 5, hiddenIndex, species.formIndex, undefined, true, 0); + pokemon = new PlayerPokemon(scene, species, 5, 2, species.formIndex, undefined, true); } else { - const hiddenIndex = species.ability2 ? 2 : 1; - pokemon = new PlayerPokemon(scene, species, 5, hiddenIndex, species.formIndex); + pokemon = new PlayerPokemon(scene, species, 5, 2, species.formIndex); } pokemon.generateAndPopulateMoveset(); @@ -87,7 +86,9 @@ export const ThePokemonSalesmanEncounter: MysteryEncounter = fileRoot: fileRoot, hasShadow: true, repeat: true, - isPokemon: true + isPokemon: true, + isShiny: pokemon.shiny, + variant: pokemon.variant }); const starterTier = speciesStarterCosts[species.speciesId]; @@ -164,3 +165,10 @@ export const ThePokemonSalesmanEncounter: MysteryEncounter = } ) .build(); + +/** + * @returns A random species that has at most 5 starter cost and is not Mythical, Paradox, etc. + */ +export function getSalesmanSpeciesOffer(): PokemonSpecies { + return getPokemonSpecies(getRandomSpeciesByStarterCost([ 0, 5 ], NON_LEGEND_PARADOX_POKEMON, undefined, false, false, false)); +} diff --git a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts index 754632aedea..c5cfd3f954e 100644 --- a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts @@ -79,6 +79,7 @@ export const TheStrongStuffEncounter: MysteryEncounter = species: getPokemonSpecies(Species.SHUCKLE), isBoss: true, bossSegments: 5, + shiny: false, // Shiny lock because shiny is rolled only if the battle option is picked customPokemonData: new CustomPokemonData({ spriteScale: 1.25 }), nature: Nature.BOLD, moveSet: [ Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER ], diff --git a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts index fba3a6ca95e..dfd89cdfb63 100644 --- a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts +++ b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts @@ -61,11 +61,12 @@ export const TrashToTreasureEncounter: MysteryEncounter = .withOnInit((scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter!; - // Calculate boss mon + // Calculate boss mon (shiny locked) const bossSpecies = getPokemonSpecies(Species.GARBODOR); const pokemonConfig: EnemyPokemonConfig = { species: bossSpecies, isBoss: true, + shiny: false, // Shiny lock because of custom intro sprite formIndex: 1, // Gmax bossSegmentModifier: 1, // +1 Segment from normal moveSet: [ Moves.PAYBACK, Moves.GUNK_SHOT, Moves.STOMPING_TANTRUM, Moves.DRAIN_PUNCH ] diff --git a/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts b/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts index a2c32c6af40..d3679825ac8 100644 --- a/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts +++ b/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts @@ -100,7 +100,9 @@ export const UncommonBreedEncounter: MysteryEncounter = hasShadow: true, x: -5, repeat: true, - isPokemon: true + isPokemon: true, + isShiny: pokemon.shiny, + variant: pokemon.variant }, ]; @@ -113,13 +115,15 @@ export const UncommonBreedEncounter: MysteryEncounter = const encounter = scene.currentBattle.mysteryEncounter!; const pokemonSprite = encounter.introVisuals!.getSprites(); - scene.tweens.add({ // Bounce at the end + // Bounce at the end, then shiny sparkle if the Pokemon is shiny + scene.tweens.add({ targets: pokemonSprite, duration: 300, ease: "Cubic.easeOut", yoyo: true, y: "-=20", loop: 1, + onComplete: () => encounter.introVisuals?.playShinySparkles() }); scene.time.delayedCall(500, () => scene.playSound("battle_anims/PRSFX- Spotlight2")); diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index c6dda134346..d43bce0ace5 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -184,7 +184,7 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: dataSource = config.dataSource; enemySpecies = config.species; isBoss = config.isBoss; - battle.enemyParty[e] = scene.addEnemyPokemon(enemySpecies, level, TrainerSlot.TRAINER, isBoss, dataSource); + battle.enemyParty[e] = scene.addEnemyPokemon(enemySpecies, level, TrainerSlot.TRAINER, isBoss, false, dataSource); } else { battle.enemyParty[e] = battle.trainer.genPartyMember(e); } @@ -202,7 +202,7 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: enemySpecies = scene.randomSpecies(battle.waveIndex, level, true); } - battle.enemyParty[e] = scene.addEnemyPokemon(enemySpecies, level, TrainerSlot.NONE, isBoss, dataSource); + battle.enemyParty[e] = scene.addEnemyPokemon(enemySpecies, level, TrainerSlot.NONE, isBoss, false, dataSource); } } @@ -731,7 +731,7 @@ export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: scene.pushPhase(new MysteryEncounterRewardsPhase(scene, addHealPhase)); scene.pushPhase(new EggLapsePhase(scene)); } else if (!scene.getEnemyParty().find(p => encounter.encounterMode !== MysteryEncounterMode.TRAINER_BATTLE ? p.isOnField() : !p?.isFainted(true))) { - scene.pushPhase(new BattleEndPhase(scene)); + scene.pushPhase(new BattleEndPhase(scene, true)); if (encounter.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { scene.pushPhase(new TrainerVictoryPhase(scene)); } diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index fc85754bdde..072b5e5b160 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -207,7 +207,7 @@ export function getHighestStatTotalPlayerPokemon(scene: BattleScene, isAllowed: * @param allowMythical * @returns */ -export function getRandomSpeciesByStarterTier(starterTiers: number | [number, number], excludedSpecies?: Species[], types?: Type[], allowSubLegendary: boolean = true, allowLegendary: boolean = true, allowMythical: boolean = true): Species { +export function getRandomSpeciesByStarterCost(starterTiers: number | [number, number], excludedSpecies?: Species[], types?: Type[], allowSubLegendary: boolean = true, allowLegendary: boolean = true, allowMythical: boolean = true): Species { let min = Array.isArray(starterTiers) ? starterTiers[0] : starterTiers; let max = Array.isArray(starterTiers) ? starterTiers[1] : starterTiers; @@ -290,7 +290,10 @@ export function applyDamageToPokemon(scene: BattleScene, pokemon: PlayerPokemon, if (damage <= 0) { console.warn("Healing pokemon with `applyDamageToPokemon` is not recommended! Please use `applyHealToPokemon` instead."); } - + // If a Pokemon would faint from the damage applied, its HP is instead set to 1. + if (pokemon.isAllowedInBattle() && pokemon.hp - damage <= 0) { + damage = pokemon.hp - 1; + } applyHpChangeToPokemon(scene, pokemon, -damage); } diff --git a/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts b/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts index fcadb101817..424ba15f811 100644 --- a/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts +++ b/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts @@ -54,7 +54,13 @@ export function doPokemonTransformationSequence(scene: BattleScene, previousPoke pokemonEvoTintSprite.setTintFill(0xFFFFFF); [ pokemonSprite, pokemonTintSprite, pokemonEvoSprite, pokemonEvoTintSprite ].map(sprite => { - sprite.play(previousPokemon.getSpriteKey(true)); + const spriteKey = previousPokemon.getSpriteKey(true); + try { + sprite.play(spriteKey); + } catch (err: unknown) { + console.error(`Failed to play animation for ${spriteKey}`, err); + } + sprite.setPipeline(scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(previousPokemon.getTeraType()) }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", previousPokemon.getSpriteKey()); @@ -69,7 +75,13 @@ export function doPokemonTransformationSequence(scene: BattleScene, previousPoke }); [ pokemonEvoSprite, pokemonEvoTintSprite ].map(sprite => { - sprite.play(transformPokemon.getSpriteKey(true)); + const spriteKey = transformPokemon.getSpriteKey(true); + try { + sprite.play(spriteKey); + } catch (err: unknown) { + console.error(`Failed to play animation for ${spriteKey}`, err); + } + sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", transformPokemon.getSpriteKey()); sprite.setPipelineData("shiny", transformPokemon.shiny); diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index 2db0ed54294..a1b2d7896d7 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -351,6 +351,10 @@ export class MeloettaFormChangePostMoveTrigger extends SpeciesFormChangePostMove if (pokemon.scene.gameMode.hasChallenge(Challenges.SINGLE_TYPE)) { return false; } else { + // Meloetta will not transform if it has the ability Sheer Force when using Relic Song + if (pokemon.hasAbility(Abilities.SHEER_FORCE)) { + return false; + } return super.canChange(pokemon); } } diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index ec104d4d4aa..09788e353cf 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -15,7 +15,7 @@ import { EvolutionLevel, SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPr import { Type } from "#enums/type"; import { LevelMoves, pokemonFormLevelMoves, pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves"; import { Stat } from "#enums/stat"; -import { Variant, VariantSet, variantColorCache, variantData } from "#app/data/variant"; +import { Variant, VariantSet, variantData } from "#app/data/variant"; import { speciesStarterCosts, POKERUS_STARTER_COUNT } from "#app/data/balance/starters"; import { SpeciesFormKey } from "#enums/species-form-key"; @@ -511,29 +511,8 @@ export abstract class PokemonSpeciesForm { } else { scene.anims.get(spriteKey).frameRate = 10; } - let spritePath = this.getSpriteAtlasPath(female, formIndex, shiny, variant).replace("variant/", "").replace(/_[1-3]$/, ""); - const useExpSprite = scene.experimentalSprites && scene.hasExpSprite(spriteKey); - if (useExpSprite) { - spritePath = `exp/${spritePath}`; - } - let config = variantData; - spritePath.split("/").map(p => config ? config = config[p] : null); - const variantSet = config as VariantSet; - if (variantSet && (variant !== undefined && variantSet[variant] === 1)) { - const populateVariantColors = (key: string): Promise => { - return new Promise(resolve => { - if (variantColorCache.hasOwnProperty(key)) { - return resolve(); - } - scene.cachedFetch(`./images/pokemon/variant/${spritePath}.json`).then(res => res.json()).then(c => { - variantColorCache[key] = c; - resolve(); - }); - }); - }; - populateVariantColors(spriteKey).then(() => resolve()); - return; - } + const spritePath = this.getSpriteAtlasPath(female, formIndex, shiny, variant).replace("variant/", "").replace(/_[1-3]$/, ""); + scene.loadPokemonVariantAssets(spriteKey, spritePath, variant); resolve(); }); if (startLoad) { diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 5e5f38bd00d..d99ca601bdf 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -1173,16 +1173,28 @@ export function getRandomPartyMemberFunc(speciesPool: Species[], trainerSlot: Tr if (!ignoreEvolution) { species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength, scene.currentBattle.waveIndex); } - return scene.addEnemyPokemon(getPokemonSpecies(species), level, trainerSlot, undefined, undefined, postProcess); + return scene.addEnemyPokemon(getPokemonSpecies(species), level, trainerSlot, undefined, false, undefined, postProcess); }; } -function getSpeciesFilterRandomPartyMemberFunc(speciesFilter: PokemonSpeciesFilter, trainerSlot: TrainerSlot = TrainerSlot.TRAINER, allowLegendaries?: boolean, postProcess?: (EnemyPokemon: EnemyPokemon) => void): PartyMemberFunc { - const originalSpeciesFilter = speciesFilter; - speciesFilter = (species: PokemonSpecies) => (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && !species.isTrainerForbidden() && originalSpeciesFilter(species); - return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => { - const ret = scene.addEnemyPokemon(getPokemonSpecies(scene.randomSpecies(scene.currentBattle.waveIndex, level, false, speciesFilter).getTrainerSpeciesForLevel(level, true, strength, scene.currentBattle.waveIndex)), level, trainerSlot, undefined, undefined, postProcess); - return ret; +function getSpeciesFilterRandomPartyMemberFunc( + originalSpeciesFilter: PokemonSpeciesFilter, + trainerSlot: TrainerSlot = TrainerSlot.TRAINER, + allowLegendaries?: boolean, + postProcess?: (EnemyPokemon: EnemyPokemon) => void +): PartyMemberFunc { + + const speciesFilter = (species: PokemonSpecies): boolean => { + const notLegendary = !species.legendary && !species.subLegendary && !species.mythical; + return (allowLegendaries || notLegendary) && !species.isTrainerForbidden() && originalSpeciesFilter(species); + }; + + return (scene: BattleScene, level: number, strength: PartyMemberStrength) => { + const waveIndex = scene.currentBattle.waveIndex; + const species = getPokemonSpecies(scene.randomSpecies(waveIndex, level, false, speciesFilter) + .getTrainerSpeciesForLevel(level, true, strength, waveIndex)); + + return scene.addEnemyPokemon(species, level, trainerSlot, undefined, false, undefined, postProcess); }; } diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts index bb969386630..f28ac37ae27 100644 --- a/src/enums/battler-tag-type.ts +++ b/src/enums/battler-tag-type.ts @@ -93,4 +93,5 @@ export enum BattlerTagType { GRUDGE = "GRUDGE", PSYCHO_SHIFT = "PSYCHO_SHIFT", ENDURE_TOKEN = "ENDURE_TOKEN", + POWDER = "POWDER", } diff --git a/src/enums/switch-type.ts b/src/enums/switch-type.ts index 752c0902636..d55872ae83b 100644 --- a/src/enums/switch-type.ts +++ b/src/enums/switch-type.ts @@ -10,5 +10,7 @@ export enum SwitchType { /** Transfers stat stages and other effects from the returning Pokemon to the switched in Pokemon */ BATON_PASS, /** Transfers the returning Pokemon's Substitute to the switched in Pokemon */ - SHED_TAIL + SHED_TAIL, + /** Force switchout to a random party member */ + FORCE_SWITCH, } diff --git a/src/field/anims.ts b/src/field/anims.ts index dddf38e4a7e..10198c29005 100644 --- a/src/field/anims.ts +++ b/src/field/anims.ts @@ -1,6 +1,7 @@ -import BattleScene from "../battle-scene"; +import BattleScene from "#app/battle-scene"; import { PokeballType } from "#enums/pokeball"; -import * as Utils from "../utils"; +import { Variant } from "#app/data/variant"; +import { getFrameMs, randGauss } from "#app/utils"; export function addPokeballOpenParticles(scene: BattleScene, x: number, y: number, pokeballType: PokeballType): void { switch (pokeballType) { @@ -127,7 +128,7 @@ function doFanOutParticle(scene: BattleScene, trigIndex: integer, x: integer, y: const particleTimer = scene.tweens.addCounter({ repeat: -1, - duration: Utils.getFrameMs(1), + duration: getFrameMs(1), onRepeat: () => { updateParticle(); } @@ -159,7 +160,7 @@ export function addPokeballCaptureStars(scene: BattleScene, pokeball: Phaser.Gam } }); - const dist = Utils.randGauss(25); + const dist = randGauss(25); scene.tweens.add({ targets: particle, x: pokeball.x + dist, @@ -185,3 +186,31 @@ export function sin(index: integer, amplitude: integer): number { export function cos(index: integer, amplitude: integer): number { return amplitude * Math.cos(index * (Math.PI / 128)); } + +/** + * Play the shiny sparkle animation and sound effect for the given sprite + * First ensures that the animation has been properly initialized + * @param sparkleSprite the Sprite to play the animation on + * @param variant which shiny {@linkcode variant} to play the animation for + */ +export function doShinySparkleAnim(scene: BattleScene, sparkleSprite: Phaser.GameObjects.Sprite, variant: Variant) { + const keySuffix = variant ? `_${variant + 1}` : ""; + const spriteKey = `shiny${keySuffix}`; + const animationKey = `sparkle${keySuffix}`; + + // Make sure the animation exists, and create it if not + if (!scene.anims.exists(animationKey)) { + const frameNames = scene.anims.generateFrameNames(spriteKey, { suffix: ".png", end: 34 }); + scene.anims.create({ + key: `sparkle${keySuffix}`, + frames: frameNames, + frameRate: 32, + showOnStart: true, + hideOnComplete: true, + }); + } + + // Play the animation + sparkleSprite.play(animationKey); + scene.playSound("se/sparkle"); +} diff --git a/src/field/arena.ts b/src/field/arena.ts index da74063ac06..3cbef659d7a 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -707,7 +707,7 @@ export class Arena { case Biome.METROPOLIS: return 141.470; case Biome.FOREST: - return 4.294; + return 0.341; case Biome.SEA: return 0.024; case Biome.SWAMP: diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index 1577d1157d7..b1b85de9b29 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -1,10 +1,12 @@ import { GameObjects } from "phaser"; -import BattleScene from "../battle-scene"; -import MysteryEncounter from "../data/mystery-encounters/mystery-encounter"; +import BattleScene from "#app/battle-scene"; +import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { Species } from "#enums/species"; import { isNullOrUndefined } from "#app/utils"; import { getSpriteKeysFromSpecies } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import PlayAnimationConfig = Phaser.Types.Animations.PlayAnimationConfig; +import { Variant } from "#app/data/variant"; +import { doShinySparkleAnim } from "#app/field/anims"; type KnownFileRoot = | "arenas" @@ -59,6 +61,10 @@ export class MysteryEncounterSpriteConfig { scale?: number; /** If you are using a Pokemon sprite, set to `true`. This will ensure variant, form, gender, shiny sprites are loaded properly */ isPokemon?: boolean; + /** If using a Pokemon shiny sprite, needs to be set to ensure the correct variant assets get loaded and displayed */ + isShiny?: boolean; + /** If using a Pokemon shiny sprite, needs to be set to ensure the correct variant assets get loaded and displayed */ + variant?: Variant; /** If you are using an item sprite, set to `true` */ isItem?: boolean; /** The sprites alpha. `0` - `1` The lower the number, the more transparent */ @@ -74,6 +80,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con public encounter: MysteryEncounter; public spriteConfigs: MysteryEncounterSpriteConfig[]; public enterFromRight: boolean; + private shinySparkleSprites: { sprite: Phaser.GameObjects.Sprite, variant: Variant }[]; constructor(scene: BattleScene, encounter: MysteryEncounter) { super(scene, -72, 76); @@ -86,7 +93,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con }; if (!isNullOrUndefined(result.species)) { - const keys = getSpriteKeysFromSpecies(result.species); + const keys = getSpriteKeysFromSpecies(result.species, undefined, undefined, result.isShiny, result.variant); result.spriteKey = keys.spriteKey; result.fileRoot = keys.fileRoot; result.isPokemon = true; @@ -120,18 +127,36 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con // Sprites with custom X or Y defined will not count for normal spacing requirements const spacingValue = Math.round((maxX - minX) / Math.max(this.spriteConfigs.filter(s => !s.x && !s.y).length, 1)); + this.shinySparkleSprites = []; + const shinySparkleSprites = scene.add.container(0, 0); this.spriteConfigs?.forEach((config) => { - const { spriteKey, isItem, hasShadow, scale, x, y, yShadow, alpha } = config; + const { spriteKey, isItem, hasShadow, scale, x, y, yShadow, alpha, isPokemon, isShiny, variant } = config; let sprite: GameObjects.Sprite; let tintSprite: GameObjects.Sprite; + let pokemonShinySparkle: Phaser.GameObjects.Sprite | undefined; - if (!isItem) { - sprite = getSprite(spriteKey, hasShadow, yShadow); - tintSprite = getSprite(spriteKey); - } else { + if (isItem) { sprite = getItemSprite(spriteKey, hasShadow, yShadow); tintSprite = getItemSprite(spriteKey); + } else { + sprite = getSprite(spriteKey, hasShadow, yShadow); + tintSprite = getSprite(spriteKey); + if (isPokemon && isShiny) { + // Set Pipeline for shiny variant + sprite.setPipelineData("spriteKey", spriteKey); + tintSprite.setPipelineData("spriteKey", spriteKey); + sprite.setPipelineData("shiny", true); + sprite.setPipelineData("variant", variant); + tintSprite.setPipelineData("shiny", true); + tintSprite.setPipelineData("variant", variant); + // Create Sprite for shiny Sparkle + pokemonShinySparkle = scene.add.sprite(sprite.x, sprite.y, "shiny"); + pokemonShinySparkle.setOrigin(0.5, 1); + pokemonShinySparkle.setVisible(false); + this.shinySparkleSprites.push({ sprite: pokemonShinySparkle, variant: variant ?? 0 }); + shinySparkleSprites.add(pokemonShinySparkle); + } } sprite.setVisible(!config.hidden); @@ -165,6 +190,11 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con } } + if (!isNullOrUndefined(pokemonShinySparkle)) { + // Offset the sparkle to match the Pokemon's position + pokemonShinySparkle.setPosition(sprite.x, sprite.y); + } + if (!isNullOrUndefined(alpha)) { sprite.setAlpha(alpha); tintSprite.setAlpha(alpha); @@ -173,6 +203,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con this.add(sprite); this.add(tintSprite); }); + this.add(shinySparkleSprites); } /** @@ -187,6 +218,9 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con this.spriteConfigs.forEach((config) => { if (config.isPokemon) { this.scene.loadPokemonAtlas(config.spriteKey, config.fileRoot); + if (config.isShiny) { + this.scene.loadPokemonVariantAssets(config.spriteKey, config.fileRoot, config.variant); + } } else if (config.isItem) { this.scene.loadAtlas("items", ""); } else { @@ -240,11 +274,21 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con this.getSprites().map((sprite, i) => { if (!this.spriteConfigs[i].isItem) { sprite.setTexture(this.spriteConfigs[i].spriteKey).setFrame(0); + if (sprite.texture.frameTotal > 1) { + // Show the first animation frame for a smooth transition when the animation starts. + const firstFrame = sprite.texture.frames["0001.png"]; + sprite.setFrame(firstFrame ?? 0); + } } }); this.getTintSprites().map((tintSprite, i) => { if (!this.spriteConfigs[i].isItem) { tintSprite.setTexture(this.spriteConfigs[i].spriteKey).setFrame(0); + if (tintSprite.texture.frameTotal > 1) { + // Show the first frame for a smooth transition when the animation starts. + const firstFrame = tintSprite.texture.frames["0001.png"]; + tintSprite.setFrame(firstFrame ?? 0); + } } }); @@ -288,6 +332,17 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con return true; } + /** + * Play shiny sparkle animations if there are shiny Pokemon + */ + playShinySparkles() { + for (const sparkleConfig of this.shinySparkleSprites) { + this.scene.time.delayedCall(500, () => { + doShinySparkleAnim(this.scene, sparkleConfig.sprite, sparkleConfig.variant); + }); + } + } + /** * For sprites with animation and that do not have animation disabled, will begin frame animation */ diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 217d5fa699b..fcfc2ff7536 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -23,13 +23,13 @@ import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "#app/data/balance/ import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, SubstituteTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, MoveRestrictionBattlerTag, ExposedTag, DragonCheerTag, CritBoostTag, TrappedTag, TarShotTag, AutotomizedTag, PowerTrickTag } from "../data/battler-tags"; import { WeatherType } from "#enums/weather-type"; import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "#app/data/arena-tag"; -import { Ability, AbAttr, StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr, PostSetStatusAbAttr, applyPostSetStatusAbAttrs, InfiltratorAbAttr, AlliedFieldDamageReductionAbAttr, PostDamageAbAttr, applyPostDamageAbAttrs, PostDamageForceSwitchAbAttr, CommanderAbAttr, applyPostItemLostAbAttrs, PostItemLostAbAttr } from "#app/data/ability"; +import { Ability, AbAttr, StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr, PostSetStatusAbAttr, applyPostSetStatusAbAttrs, InfiltratorAbAttr, AlliedFieldDamageReductionAbAttr, PostDamageAbAttr, applyPostDamageAbAttrs, CommanderAbAttr, applyPostItemLostAbAttrs, PostItemLostAbAttr } from "#app/data/ability"; import PokemonData from "#app/system/pokemon-data"; import { BattlerIndex } from "#app/battle"; import { Mode } from "#app/ui/ui"; import PartyUiHandler, { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; -import { LevelMoves } from "#app/data/balance/pokemon-level-moves"; +import { EVOLVE_MOVE, LevelMoves, RELEARN_MOVE } from "#app/data/balance/pokemon-level-moves"; import { DamageAchv, achvs } from "#app/system/achv"; import { DexAttr, StarterDataEntry, StarterMoveset } from "#app/system/game-data"; import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from "@material/material-color-utilities"; @@ -51,7 +51,7 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { getPokemonNameWithAffix } from "#app/messages"; -import { DamagePhase } from "#app/phases/damage-phase"; +import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { FaintPhase } from "#app/phases/faint-phase"; import { LearnMovePhase } from "#app/phases/learn-move-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; @@ -69,6 +69,16 @@ import { SpeciesFormKey } from "#enums/species-form-key"; import { BASE_HIDDEN_ABILITY_CHANCE, BASE_SHINY_CHANCE, SHINY_EPIC_CHANCE, SHINY_VARIANT_CHANCE } from "#app/data/balance/rates"; import { Nature } from "#enums/nature"; import { StatusEffect } from "#enums/status-effect"; +import { doShinySparkleAnim } from "#app/field/anims"; + +export enum LearnMoveSituation { + MISC, + LEVEL_UP, + RELEARN, + EVOLUTION, + EVOLUTION_FUSED, // If fusionSpecies has Evolved + EVOLUTION_FUSED_BASE // If fusion's base species has Evolved +} export enum FieldPosition { CENTER, @@ -325,6 +335,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!this.scene) { return false; } + if (this.switchOutStatus) { + return false; + } return this.scene.field.getIndex(this) > -1; } @@ -670,21 +683,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } initShinySparkle(): void { - const keySuffix = this.variant ? `_${this.variant + 1}` : ""; - const key = `shiny${keySuffix}`; - const shinySparkle = this.scene.addFieldSprite(0, 0, key); + const shinySparkle = this.scene.addFieldSprite(0, 0, "shiny"); shinySparkle.setVisible(false); shinySparkle.setOrigin(0.5, 1); - const frameNames = this.scene.anims.generateFrameNames(key, { suffix: ".png", end: 34 }); - if (!(this.scene.anims.exists(`sparkle${keySuffix}`))) { - this.scene.anims.create({ - key: `sparkle${keySuffix}`, - frames: frameNames, - frameRate: 32, - showOnStart: true, - hideOnComplete: true, - }); - } this.add(shinySparkle); this.shinySparkle = shinySparkle; @@ -1583,7 +1584,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } const trappedByAbility = new Utils.BooleanHolder(false); - const opposingField = this.isPlayer() ? this.scene.getEnemyField() : this.scene.getPlayerField(); + /** + * Contains opposing Pokemon (Enemy/Player Pokemon) depending on perspective + * Afterwards, it filters out Pokemon that have been switched out of the field so trapped abilities/moves do not trigger + */ + const opposingFieldUnfiltered = this.isPlayer() ? this.scene.getEnemyField() : this.scene.getPlayerField(); + const opposingField = opposingFieldUnfiltered.filter(enemyPkm => enemyPkm.switchOutStatus === false); opposingField.forEach((opponent) => applyCheckTrappedAbAttrs(CheckTrappedAbAttr, opponent, trappedByAbility, this, trappedAbMessages, simulated) @@ -1820,40 +1826,44 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param {boolean} includeRelearnerMoves Whether to include moves that would require a relearner. Note the move relearner inherently allows evolution moves * @returns {LevelMoves} A list of moves and the levels they can be learned at */ - getLevelMoves(startingLevel?: integer, includeEvolutionMoves: boolean = false, simulateEvolutionChain: boolean = false, includeRelearnerMoves: boolean = false): LevelMoves { + getLevelMoves(startingLevel?: integer, includeEvolutionMoves: boolean = false, simulateEvolutionChain: boolean = false, includeRelearnerMoves: boolean = false, learnSituation: LearnMoveSituation = LearnMoveSituation.MISC): LevelMoves { const ret: LevelMoves = []; let levelMoves: LevelMoves = []; if (!startingLevel) { startingLevel = this.level; } - if (simulateEvolutionChain) { - const evolutionChain = this.species.getSimulatedEvolutionChain(this.level, this.hasTrainer(), this.isBoss(), this.isPlayer()); - for (let e = 0; e < evolutionChain.length; e++) { - // TODO: Might need to pass specific form index in simulated evolution chain - const speciesLevelMoves = getPokemonSpeciesForm(evolutionChain[e][0], this.formIndex).getLevelMoves(); - if (includeRelearnerMoves) { - levelMoves.push(...speciesLevelMoves); - } else { - levelMoves.push(...speciesLevelMoves.filter(lm => (includeEvolutionMoves && lm[0] === 0) || ((!e || lm[0] > 1) && (e === evolutionChain.length - 1 || lm[0] <= evolutionChain[e + 1][1])))); - } - } + if (learnSituation === LearnMoveSituation.EVOLUTION_FUSED && this.fusionSpecies) { // For fusion evolutions, get ONLY the moves of the component mon that evolved + levelMoves = this.getFusionSpeciesForm(true).getLevelMoves().filter(lm => (includeEvolutionMoves && lm[0] === EVOLVE_MOVE) || (includeRelearnerMoves && lm[0] === RELEARN_MOVE) || lm[0] > 0); } else { - levelMoves = this.getSpeciesForm(true).getLevelMoves().filter(lm => (includeEvolutionMoves && lm[0] === 0) || (includeRelearnerMoves && lm[0] === -1) || lm[0] > 0); - } - if (this.fusionSpecies) { if (simulateEvolutionChain) { - const fusionEvolutionChain = this.fusionSpecies.getSimulatedEvolutionChain(this.level, this.hasTrainer(), this.isBoss(), this.isPlayer()); - for (let e = 0; e < fusionEvolutionChain.length; e++) { + const evolutionChain = this.species.getSimulatedEvolutionChain(this.level, this.hasTrainer(), this.isBoss(), this.isPlayer()); + for (let e = 0; e < evolutionChain.length; e++) { // TODO: Might need to pass specific form index in simulated evolution chain - const speciesLevelMoves = getPokemonSpeciesForm(fusionEvolutionChain[e][0], this.fusionFormIndex).getLevelMoves(); + const speciesLevelMoves = getPokemonSpeciesForm(evolutionChain[e][0], this.formIndex).getLevelMoves(); if (includeRelearnerMoves) { - levelMoves.push(...speciesLevelMoves.filter(lm => (includeEvolutionMoves && lm[0] === 0) || lm[0] !== 0)); + levelMoves.push(...speciesLevelMoves); } else { - levelMoves.push(...speciesLevelMoves.filter(lm => (includeEvolutionMoves && lm[0] === 0) || ((!e || lm[0] > 1) && (e === fusionEvolutionChain.length - 1 || lm[0] <= fusionEvolutionChain[e + 1][1])))); + levelMoves.push(...speciesLevelMoves.filter(lm => (includeEvolutionMoves && lm[0] === EVOLVE_MOVE) || ((!e || lm[0] > 1) && (e === evolutionChain.length - 1 || lm[0] <= evolutionChain[e + 1][1])))); } } } else { - levelMoves.push(...this.getFusionSpeciesForm(true).getLevelMoves().filter(lm => (includeEvolutionMoves && lm[0] === 0) || (includeRelearnerMoves && lm[0] === -1) || lm[0] > 0)); + levelMoves = this.getSpeciesForm(true).getLevelMoves().filter(lm => (includeEvolutionMoves && lm[0] === EVOLVE_MOVE) || (includeRelearnerMoves && lm[0] === RELEARN_MOVE) || lm[0] > 0); + } + if (this.fusionSpecies && learnSituation !== LearnMoveSituation.EVOLUTION_FUSED_BASE) { // For fusion evolutions, get ONLY the moves of the component mon that evolved + if (simulateEvolutionChain) { + const fusionEvolutionChain = this.fusionSpecies.getSimulatedEvolutionChain(this.level, this.hasTrainer(), this.isBoss(), this.isPlayer()); + for (let e = 0; e < fusionEvolutionChain.length; e++) { + // TODO: Might need to pass specific form index in simulated evolution chain + const speciesLevelMoves = getPokemonSpeciesForm(fusionEvolutionChain[e][0], this.fusionFormIndex).getLevelMoves(); + if (includeRelearnerMoves) { + levelMoves.push(...speciesLevelMoves.filter(lm => (includeEvolutionMoves && lm[0] === EVOLVE_MOVE) || lm[0] !== EVOLVE_MOVE)); + } else { + levelMoves.push(...speciesLevelMoves.filter(lm => (includeEvolutionMoves && lm[0] === EVOLVE_MOVE) || ((!e || lm[0] > 1) && (e === fusionEvolutionChain.length - 1 || lm[0] <= fusionEvolutionChain[e + 1][1])))); + } + } + } else { + levelMoves.push(...this.getFusionSpeciesForm(true).getLevelMoves().filter(lm => (includeEvolutionMoves && lm[0] === EVOLVE_MOVE) || (includeRelearnerMoves && lm[0] === RELEARN_MOVE) || lm[0] > 0)); + } } } levelMoves.sort((lma: [integer, integer], lmb: [integer, integer]) => lma[0] > lmb[0] ? 1 : lma[0] < lmb[0] ? -1 : 0); @@ -1968,6 +1978,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { /** * Function that tries to set a Pokemon shiny based on seed. * For manual use only, usually to roll a Pokemon's shiny chance a second time. + * If it rolls shiny, also sets a random variant and give the Pokemon the associated luck. * * The base shiny odds are {@linkcode BASE_SHINY_CHANCE} / `65536` * @param thresholdOverride number that is divided by `2^16` (`65536`) to get the shiny chance, overrides {@linkcode shinyThreshold} if set (bypassing shiny rate modifiers such as Shiny Charm) @@ -1993,6 +2004,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.shiny = randSeedInt(65536) < shinyThreshold.value; if (this.shiny) { + this.variant = this.generateShinyVariant(); + this.luck = this.variant + 1 + (this.fusionShiny ? this.fusionVariant + 1 : 0); this.initShinySparkle(); } @@ -2618,8 +2631,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { }; } - // If the attack deals fixed damaged, return a result with that much damage - const fixedDamage = new Utils.IntegerHolder(0); + // If the attack deals fixed damage, return a result with that much damage + const fixedDamage = new Utils.NumberHolder(0); applyMoveAttrs(FixedDamageAttr, source, this, move, fixedDamage); if (fixedDamage.value) { const multiLensMultiplier = new Utils.NumberHolder(1); @@ -2896,14 +2909,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.turnData.damageTaken += damage; this.battleData.hitCount++; - // Multi-Lens and Parental Bond check for Wimp Out/Emergency Exit - if (this.hasAbilityWithAttr(PostDamageForceSwitchAbAttr)) { - const multiHitModifier = source.getHeldItems().find(m => m instanceof PokemonMultiHitModifier); - if (multiHitModifier || source.hasAbilityWithAttr(AddSecondStrikeAbAttr)) { - applyPostDamageAbAttrs(PostDamageAbAttr, this, damage, this.hasPassive(), false, [], source); - } - } - const attackResult = { move: move.id, result: result as DamageResult, damage: damage, critical: isCritical, sourceId: source.id, sourceBattlerIndex: source.getBattlerIndex() }; this.turnData.attacksReceived.unshift(attackResult); if (source.isPlayer() && !this.isPlayer()) { @@ -3004,13 +3009,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param ignoreFaintPhase boolean to ignore adding a FaintPhase, passsed to damage() * @returns integer of damage done */ - damageAndUpdate(damage: integer, result?: DamageResult, critical: boolean = false, ignoreSegments: boolean = false, preventEndure: boolean = false, ignoreFaintPhase: boolean = false, source?: Pokemon): integer { - const damagePhase = new DamagePhase(this.scene, this.getBattlerIndex(), damage, result as DamageResult, critical); + damageAndUpdate(damage: number, result?: DamageResult, critical: boolean = false, ignoreSegments: boolean = false, preventEndure: boolean = false, ignoreFaintPhase: boolean = false, source?: Pokemon): number { + const damagePhase = new DamageAnimPhase(this.scene, this.getBattlerIndex(), damage, result as DamageResult, critical); this.scene.unshiftPhase(damagePhase); + if (this.switchOutStatus && source) { + damage = 0; + } damage = this.damage(damage, ignoreSegments, preventEndure, ignoreFaintPhase); // Damage amount may have changed, but needed to be queued before calling damage function damagePhase.updateAmount(damage); - applyPostDamageAbAttrs(PostDamageAbAttr, this, damage, this.hasPassive(), false, [], source); + /** + * Run PostDamageAbAttr from any source of damage that is not from a multi-hit + * Multi-hits are handled in move-effect-phase.ts for PostDamageAbAttr + */ + if (!source || source.turnData.hitCount <= 1) { + applyPostDamageAbAttrs(PostDamageAbAttr, this, damage, this.hasPassive(), false, [], source); + } return damage; } @@ -3487,12 +3501,21 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.gender !== Gender.GENDERLESS && pokemon.gender === (this.gender === Gender.MALE ? Gender.FEMALE : Gender.MALE); } - canSetStatus(effect: StatusEffect | undefined, quiet: boolean = false, overrideStatus: boolean = false, sourcePokemon: Pokemon | null = null): boolean { + /** + * Checks if a status effect can be applied to the Pokemon. + * + * @param effect The {@linkcode StatusEffect} whose applicability is being checked + * @param quiet Whether in-battle messages should trigger or not + * @param overrideStatus Whether the Pokemon's current status can be overriden + * @param sourcePokemon The Pokemon that is setting the status effect + * @param ignoreField Whether any field effects (weather, terrain, etc.) should be considered + */ + canSetStatus(effect: StatusEffect | undefined, quiet: boolean = false, overrideStatus: boolean = false, sourcePokemon: Pokemon | null = null, ignoreField: boolean = false): boolean { if (effect !== StatusEffect.FAINT) { if (overrideStatus ? this.status?.effect === effect : this.status) { return false; } - if (this.isGrounded() && this.scene.arena.terrain?.terrainType === TerrainType.MISTY) { + if (this.isGrounded() && (!ignoreField && this.scene.arena.terrain?.terrainType === TerrainType.MISTY)) { return false; } } @@ -3542,7 +3565,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } break; case StatusEffect.FREEZE: - if (this.isOfType(Type.ICE) || (this.scene?.arena?.weather?.weatherType && [ WeatherType.SUNNY, WeatherType.HARSH_SUN ].includes(this.scene.arena.weather.weatherType))) { + if (this.isOfType(Type.ICE) || (!ignoreField && (this.scene?.arena?.weather?.weatherType && [ WeatherType.SUNNY, WeatherType.HARSH_SUN ].includes(this.scene.arena.weather.weatherType)))) { return false; } break; @@ -3727,8 +3750,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { setFrameRate(frameRate: integer) { this.scene.anims.get(this.getBattleSpriteKey()).frameRate = frameRate; - this.getSprite().play(this.getBattleSpriteKey()); - this.getTintSprite()?.play(this.getBattleSpriteKey()); + try { + this.getSprite().play(this.getBattleSpriteKey()); + } catch (err: unknown) { + console.error(`Failed to play animation for ${this.getBattleSpriteKey()}`, err); + } + try { + this.getTintSprite()?.play(this.getBattleSpriteKey()); + } catch (err: unknown) { + console.error(`Failed to play animation for ${this.getBattleSpriteKey()}`, err); + } } tint(color: number, alpha?: number, duration?: integer, ease?: string) { @@ -3793,8 +3824,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { sparkle(): void { if (this.shinySparkle) { - this.shinySparkle.play(`sparkle${this.variant ? `_${this.variant + 1}` : ""}`); - this.scene.playSound("se/sparkle"); + doShinySparkleAnim(this.scene, this.shinySparkle, this.variant); } } @@ -4271,28 +4301,29 @@ export class PlayerPokemon extends Pokemon { }); } - addFriendship(friendship: integer): void { - const starterSpeciesId = this.species.getRootSpeciesId(); - const fusionStarterSpeciesId = this.isFusion() && this.fusionSpecies ? this.fusionSpecies.getRootSpeciesId() : 0; - const starterData = [ - this.scene.gameData.starterData[starterSpeciesId], - fusionStarterSpeciesId ? this.scene.gameData.starterData[fusionStarterSpeciesId] : null - ].filter(d => !!d); - const amount = new Utils.IntegerHolder(friendship); - let candyFriendshipMultiplier = CLASSIC_CANDY_FRIENDSHIP_MULTIPLIER; - if (this.scene.eventManager.isEventActive()) { - candyFriendshipMultiplier *= this.scene.eventManager.getFriendshipMultiplier(); - } - const starterAmount = new Utils.IntegerHolder(Math.floor(friendship * (this.scene.gameMode.isClassic && friendship > 0 ? candyFriendshipMultiplier : 1) / (fusionStarterSpeciesId ? 2 : 1))); - if (amount.value > 0) { + addFriendship(friendship: number): void { + if (friendship > 0) { + const starterSpeciesId = this.species.getRootSpeciesId(); + const fusionStarterSpeciesId = this.isFusion() && this.fusionSpecies ? this.fusionSpecies.getRootSpeciesId() : 0; + const starterData = [ + this.scene.gameData.starterData[starterSpeciesId], + fusionStarterSpeciesId ? this.scene.gameData.starterData[fusionStarterSpeciesId] : null + ].filter(d => !!d); + const amount = new Utils.NumberHolder(friendship); this.scene.applyModifier(PokemonFriendshipBoosterModifier, true, this, amount); - this.scene.applyModifier(PokemonFriendshipBoosterModifier, true, this, starterAmount); + let candyFriendshipMultiplier = CLASSIC_CANDY_FRIENDSHIP_MULTIPLIER; + if (this.scene.eventManager.isEventActive()) { + candyFriendshipMultiplier *= this.scene.eventManager.getFriendshipMultiplier(); + } + const starterAmount = new Utils.NumberHolder(Math.floor(amount.value * (this.scene.gameMode.isClassic ? candyFriendshipMultiplier : 1) / (fusionStarterSpeciesId ? 2 : 1))); + // Add friendship to this PlayerPokemon this.friendship = Math.min(this.friendship + amount.value, 255); if (this.friendship === 255) { this.scene.validateAchv(achvs.MAX_FRIENDSHIP); } - starterData.forEach((sd: StarterDataEntry, i: integer) => { + // Add to candy progress for this mon's starter species and its fused species (if it has one) + starterData.forEach((sd: StarterDataEntry, i: number) => { const speciesId = !i ? starterSpeciesId : fusionStarterSpeciesId as Species; sd.friendship = (sd.friendship || 0) + starterAmount.value; if (sd.friendship >= getStarterValueFriendshipCap(speciesStarterCosts[speciesId])) { @@ -4301,10 +4332,8 @@ export class PlayerPokemon extends Pokemon { } }); } else { - this.friendship = Math.max(this.friendship + amount.value, 0); - for (const sd of starterData) { - sd.friendship = Math.max((sd.friendship || 0) + starterAmount.value, 0); - } + // Lose friendship upon fainting + this.friendship = Math.max(this.friendship + friendship, 0); } } /** @@ -4637,12 +4666,13 @@ export class EnemyPokemon extends Pokemon { public aiType: AiType; public bossSegments: integer; public bossSegmentIndex: integer; - /** To indicate of the instance was populated with a dataSource -> e.g. loaded & populated from session data */ + /** To indicate if the instance was populated with a dataSource -> e.g. loaded & populated from session data */ public readonly isPopulatedFromDataSource: boolean; - constructor(scene: BattleScene, species: PokemonSpecies, level: integer, trainerSlot: TrainerSlot, boss: boolean, dataSource?: PokemonData) { - super(scene, 236, 84, species, level, dataSource?.abilityIndex, dataSource?.formIndex, - dataSource?.gender, dataSource ? dataSource.shiny : false, dataSource ? dataSource.variant : undefined, undefined, dataSource ? dataSource.nature : undefined, dataSource); + constructor(scene: BattleScene, species: PokemonSpecies, level: integer, trainerSlot: TrainerSlot, boss: boolean, shinyLock: boolean = false, dataSource?: PokemonData) { + super(scene, 236, 84, species, level, dataSource?.abilityIndex, dataSource?.formIndex, dataSource?.gender, + (!shinyLock && dataSource) ? dataSource.shiny : false, (!shinyLock && dataSource) ? dataSource.variant : undefined, + undefined, dataSource ? dataSource.nature : undefined, dataSource); this.trainerSlot = trainerSlot; this.isPopulatedFromDataSource = !!dataSource; // if a dataSource is provided, then it was populated from dataSource @@ -4671,12 +4701,15 @@ export class EnemyPokemon extends Pokemon { if (!dataSource) { this.generateAndPopulateMoveset(); - this.trySetShiny(); - if (Overrides.OPP_SHINY_OVERRIDE) { + if (shinyLock || Overrides.OPP_SHINY_OVERRIDE === false) { + this.shiny = false; + } else { + this.trySetShiny(); + } + + if (!this.shiny && Overrides.OPP_SHINY_OVERRIDE) { this.shiny = true; this.initShinySparkle(); - } else if (Overrides.OPP_SHINY_OVERRIDE === false) { - this.shiny = false; } if (this.shiny) { @@ -5261,6 +5294,7 @@ export class PokemonBattleSummonData { export class PokemonTurnData { public flinched: boolean = false; public acted: boolean = false; + /** How many times the move should hit the target(s) */ public hitCount: number = 0; /** * - `-1` = Calculate how many hits are left @@ -5279,6 +5313,11 @@ export class PokemonTurnData { public switchedInThisTurn: boolean = false; public failedRunAway: boolean = false; public joinedRound: boolean = false; + /** + * Used to make sure multi-hits occur properly when the user is + * forced to act again in the same turn + */ + public extraTurns: number = 0; } export enum AiType { diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 4986c1feab1..57b3ced1813 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1702,7 +1702,8 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.EVOLUTION_ITEM, (party: Pokemon[]) => { return Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 15), 8); }, 8), - new WeightedModifierType(modifierTypes.MAP, (party: Pokemon[]) => party[0].scene.gameMode.isClassic && party[0].scene.currentBattle.waveIndex < 180 ? 1 : 0, 1), + new WeightedModifierType(modifierTypes.MAP, (party: Pokemon[]) => party[0].scene.gameMode.isClassic && party[0].scene.currentBattle.waveIndex < 180 ? 2 : 0, 2), + new WeightedModifierType(modifierTypes.SOOTHE_BELL, 2), new WeightedModifierType(modifierTypes.TM_GREAT, 3), new WeightedModifierType(modifierTypes.MEMORY_MUSHROOM, (party: Pokemon[]) => { if (!party.find(p => p.getLearnableLevelMoves().length)) { @@ -1730,8 +1731,14 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.EVIOLITE, (party: Pokemon[]) => { const { gameMode, gameData } = party[0].scene; if (gameMode.isDaily || (!gameMode.isFreshStartChallenge() && gameData.isUnlocked(Unlockables.EVIOLITE))) { - return party.some(p => ((p.getSpeciesForm(true).speciesId in pokemonEvolutions) || (p.isFusion() && (p.getFusionSpeciesForm(true).speciesId in pokemonEvolutions))) - && !p.getHeldItems().some(i => i instanceof EvolutionStatBoosterModifier) && !p.isMax()) ? 10 : 0; + return party.some(p => { + // Check if Pokemon's species (or fusion species, if applicable) can evolve or if they're G-Max'd + if (!p.isMax() && ((p.getSpeciesForm(true).speciesId in pokemonEvolutions) || (p.isFusion() && (p.getFusionSpeciesForm(true).speciesId in pokemonEvolutions)))) { + // Check if Pokemon is already holding an Eviolite + return !p.getHeldItems().some(i => i.type.id === "EVIOLITE"); + } + return false; + }) ? 10 : 0; } return 0; }), @@ -1744,19 +1751,59 @@ const modifierPool: ModifierPool = { || (p.isFusion() && checkedSpecies.includes(p.getFusionSpeciesForm(true).speciesId)))) ? 12 : 0; }, 12), new WeightedModifierType(modifierTypes.TOXIC_ORB, (party: Pokemon[]) => { - const checkedAbilities = [ Abilities.QUICK_FEET, Abilities.GUTS, Abilities.MARVEL_SCALE, Abilities.TOXIC_BOOST, Abilities.POISON_HEAL, Abilities.MAGIC_GUARD ]; - const checkedMoves = [ Moves.FACADE, Moves.TRICK, Moves.FLING, Moves.SWITCHEROO, Moves.PSYCHO_SHIFT ]; - // If a party member doesn't already have one of these two orbs and has one of the above moves or abilities, the orb can appear - return party.some(p => !p.getHeldItems().some(i => i instanceof TurnStatusEffectModifier) - && (checkedAbilities.some(a => p.hasAbility(a, false, true)) - || p.getMoveset(true).some(m => m && checkedMoves.includes(m.moveId)))) ? 10 : 0; + return party.some(p => { + const moveset = p.getMoveset(true).filter(m => !isNullOrUndefined(m)).map(m => m.moveId); + + const canSetStatus = p.canSetStatus(StatusEffect.TOXIC, true, true, null, true); + const isHoldingOrb = p.getHeldItems().some(i => i.type.id === "FLAME_ORB" || i.type.id === "TOXIC_ORB"); + + // Moves that take advantage of obtaining the actual status effect + const hasStatusMoves = [ Moves.FACADE, Moves.PSYCHO_SHIFT ] + .some(m => moveset.includes(m)); + // Moves that take advantage of being able to give the target a status orb + // TODO: Take moves from comment they are implemented + const hasItemMoves = [ /* Moves.TRICK, Moves.FLING, Moves.SWITCHEROO */ ] + .some(m => moveset.includes(m)); + // Abilities that take advantage of obtaining the actual status effect + const hasRelevantAbilities = [ Abilities.QUICK_FEET, Abilities.GUTS, Abilities.MARVEL_SCALE, Abilities.TOXIC_BOOST, Abilities.POISON_HEAL, Abilities.MAGIC_GUARD ] + .some(a => p.hasAbility(a, false, true)); + + if (!isHoldingOrb) { + if (canSetStatus) { + return hasRelevantAbilities || hasStatusMoves; + } else { + return hasItemMoves; + } + } + return false; + }) ? 10 : 0; }, 10), new WeightedModifierType(modifierTypes.FLAME_ORB, (party: Pokemon[]) => { - const checkedAbilities = [ Abilities.QUICK_FEET, Abilities.GUTS, Abilities.MARVEL_SCALE, Abilities.FLARE_BOOST, Abilities.MAGIC_GUARD ]; - const checkedMoves = [ Moves.FACADE, Moves.TRICK, Moves.FLING, Moves.SWITCHEROO, Moves.PSYCHO_SHIFT ]; - // If a party member doesn't already have one of these two orbs and has one of the above moves or abilities, the orb can appear - return party.some(p => !p.getHeldItems().some(i => i instanceof TurnStatusEffectModifier) - && (checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(m => m && checkedMoves.includes(m.moveId)))) ? 10 : 0; + return party.some(p => { + const moveset = p.getMoveset(true).filter(m => !isNullOrUndefined(m)).map(m => m.moveId); + const canSetStatus = p.canSetStatus(StatusEffect.BURN, true, true, null, true); + const isHoldingOrb = p.getHeldItems().some(i => i.type.id === "FLAME_ORB" || i.type.id === "TOXIC_ORB"); + + // Moves that take advantage of obtaining the actual status effect + const hasStatusMoves = [ Moves.FACADE, Moves.PSYCHO_SHIFT ] + .some(m => moveset.includes(m)); + // Moves that take advantage of being able to give the target a status orb + // TODO: Take moves from comment they are implemented + const hasItemMoves = [ /* Moves.TRICK, Moves.FLING, Moves.SWITCHEROO */ ] + .some(m => moveset.includes(m)); + // Abilities that take advantage of obtaining the actual status effect + const hasRelevantAbilities = [ Abilities.QUICK_FEET, Abilities.GUTS, Abilities.MARVEL_SCALE, Abilities.FLARE_BOOST, Abilities.MAGIC_GUARD ] + .some(a => p.hasAbility(a, false, true)); + + if (!isHoldingOrb) { + if (canSetStatus) { + return hasRelevantAbilities || hasStatusMoves; + } else { + return hasItemMoves; + } + } + return false; + }) ? 10 : 0; }, 10), new WeightedModifierType(modifierTypes.WHITE_HERB, (party: Pokemon[]) => { const checkedAbilities = [ Abilities.WEAK_ARMOR, Abilities.CONTRARY, Abilities.MOODY, Abilities.ANGER_SHELL, Abilities.COMPETITIVE, Abilities.DEFIANT ]; @@ -1794,7 +1841,6 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.SOUL_DEW, 7), //new WeightedModifierType(modifierTypes.OVAL_CHARM, 6), new WeightedModifierType(modifierTypes.CATCHING_CHARM, (party: Pokemon[]) => !party[0].scene.gameMode.isFreshStartChallenge() && party[0].scene.gameData.getSpeciesCount(d => !!d.caughtAttr) > 100 ? 4 : 0, 4), - new WeightedModifierType(modifierTypes.SOOTHE_BELL, 4), new WeightedModifierType(modifierTypes.ABILITY_CHARM, skipInClassicAfterWave(189, 6)), new WeightedModifierType(modifierTypes.FOCUS_BAND, 5), new WeightedModifierType(modifierTypes.KINGS_ROCK, 3), diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 5e5246269a3..05d9e8b9897 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -18,7 +18,6 @@ import type { VoucherType } from "#app/system/voucher"; import { Command } from "#app/ui/command-ui-handler"; import { addTextObject, TextStyle } from "#app/ui/text"; import { BooleanHolder, hslToHex, isNullOrUndefined, NumberHolder, toDmgValue } from "#app/utils"; -import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BerryType } from "#enums/berry-type"; import { Moves } from "#enums/moves"; @@ -726,22 +725,6 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { return 1; } - //Applies to items with chance of activating secondary effects ie Kings Rock - getSecondaryChanceMultiplier(pokemon: Pokemon): number { - // Temporary quickfix to stop game from freezing when the opponet uses u-turn while holding on to king's rock - if (!pokemon.getLastXMoves()[0]) { - return 1; - } - const sheerForceAffected = allMoves[pokemon.getLastXMoves()[0].move].chance >= 0 && pokemon.hasAbility(Abilities.SHEER_FORCE); - - if (sheerForceAffected) { - return 0; - } else if (pokemon.hasAbility(Abilities.SERENE_GRACE)) { - return 2; - } - return 1; - } - getMaxStackCount(scene: BattleScene, forThreshold?: boolean): number { const pokemon = this.getPokemon(scene); if (!pokemon) { @@ -1614,9 +1597,16 @@ export class BypassSpeedChanceModifier extends PokemonHeldItemModifier { } } +/** + * Class for Pokemon held items like King's Rock + * Because King's Rock can be stacked in PokeRogue, unlike mainline, it does not receive a boost from Abilities.SERENE_GRACE + */ export class FlinchChanceModifier extends PokemonHeldItemModifier { + private chance: number; constructor(type: ModifierType, pokemonId: number, stackCount?: number) { super(type, pokemonId, stackCount); + + this.chance = 10; } matchType(modifier: Modifier) { @@ -1644,7 +1634,8 @@ export class FlinchChanceModifier extends PokemonHeldItemModifier { * @returns `true` if {@linkcode FlinchChanceModifier} has been applied */ override apply(pokemon: Pokemon, flinched: BooleanHolder): boolean { - if (!flinched.value && pokemon.randSeedInt(10) < (this.getStackCount() * this.getSecondaryChanceMultiplier(pokemon))) { + // The check for pokemon.battleSummonData is to ensure that a crash doesn't occur when a Pokemon with King's Rock procs a flinch + if (pokemon.battleSummonData && !flinched.value && pokemon.randSeedInt(100) < (this.getStackCount() * this.chance)) { flinched.value = true; return true; } @@ -1652,7 +1643,7 @@ export class FlinchChanceModifier extends PokemonHeldItemModifier { return false; } - getMaxHeldItemCount(pokemon: Pokemon): number { + getMaxHeldItemCount(_pokemon: Pokemon): number { return 3; } } diff --git a/src/overrides.ts b/src/overrides.ts index 7b73cd47b03..85be47d95cc 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -86,6 +86,8 @@ class DefaultOverrides { readonly ITEM_UNLOCK_OVERRIDE: Unlockables[] = []; /** Set to `true` to show all tutorials */ readonly BYPASS_TUTORIAL_SKIP_OVERRIDE: boolean = false; + /** Set to `true` to be able to re-earn already unlocked achievements */ + readonly ACHIEVEMENTS_REUNLOCK_OVERRIDE: boolean = false; /** Set to `true` to force Paralysis and Freeze to always activate, or `false` to force them to not activate */ readonly STATUS_ACTIVATION_OVERRIDE: boolean | null = null; @@ -175,7 +177,11 @@ class DefaultOverrides { // MYSTERY ENCOUNTER OVERRIDES // ------------------------- - /** 1 to 256, set to null to ignore */ + /** + * `1` (almost never) to `256` (always), set to `null` to disable the override + * + * Note: Make sure `STARTING_WAVE_OVERRIDE > 10`, otherwise MEs won't trigger + */ readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number | null = null; readonly MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier | null = null; readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType | null = null; diff --git a/src/phases/attempt-run-phase.ts b/src/phases/attempt-run-phase.ts index b4768dc9a26..109fc5b582d 100644 --- a/src/phases/attempt-run-phase.ts +++ b/src/phases/attempt-run-phase.ts @@ -52,7 +52,7 @@ export class AttemptRunPhase extends PokemonPhase { enemyPokemon.trySetStatus(StatusEffect.FAINT); }); - this.scene.pushPhase(new BattleEndPhase(this.scene)); + this.scene.pushPhase(new BattleEndPhase(this.scene, false)); this.scene.pushPhase(new NewBattlePhase(this.scene)); } else { playerPokemon.turnData.failedRunAway = true; diff --git a/src/phases/battle-end-phase.ts b/src/phases/battle-end-phase.ts index 3b9ca012ef7..8926a2211e0 100644 --- a/src/phases/battle-end-phase.ts +++ b/src/phases/battle-end-phase.ts @@ -8,7 +8,7 @@ export class BattleEndPhase extends BattlePhase { /** If true, will increment battles won */ isVictory: boolean; - constructor(scene: BattleScene, isVictory: boolean = true) { + constructor(scene: BattleScene, isVictory: boolean) { super(scene); this.isVictory = isVictory; @@ -17,16 +17,17 @@ export class BattleEndPhase extends BattlePhase { start() { super.start(); + this.scene.gameData.gameStats.battles++; + if (this.scene.gameMode.isEndless && this.scene.currentBattle.waveIndex + 1 > this.scene.gameData.gameStats.highestEndlessWave) { + this.scene.gameData.gameStats.highestEndlessWave = this.scene.currentBattle.waveIndex + 1; + } + if (this.isVictory) { this.scene.currentBattle.addBattleScore(this.scene); - this.scene.gameData.gameStats.battles++; if (this.scene.currentBattle.trainer) { this.scene.gameData.gameStats.trainersDefeated++; } - if (this.scene.gameMode.isEndless && this.scene.currentBattle.waveIndex + 1 > this.scene.gameData.gameStats.highestEndlessWave) { - this.scene.gameData.gameStats.highestEndlessWave = this.scene.currentBattle.waveIndex + 1; - } } // Endless graceful end @@ -42,7 +43,7 @@ export class BattleEndPhase extends BattlePhase { } for (const pokemon of this.scene.getPokemonAllowedInBattle()) { - applyPostBattleAbAttrs(PostBattleAbAttr, pokemon); + applyPostBattleAbAttrs(PostBattleAbAttr, pokemon, false, this.isVictory); } if (this.scene.currentBattle.moneyScattered) { diff --git a/src/phases/check-switch-phase.ts b/src/phases/check-switch-phase.ts index acf17c75668..18b999ed210 100644 --- a/src/phases/check-switch-phase.ts +++ b/src/phases/check-switch-phase.ts @@ -5,7 +5,6 @@ import { getPokemonNameWithAffix } from "#app/messages"; import { Mode } from "#app/ui/ui"; import i18next from "i18next"; import { BattlePhase } from "./battle-phase"; -import { PostSummonPhase } from "./post-summon-phase"; import { SummonMissingPhase } from "./summon-missing-phase"; import { SwitchPhase } from "./switch-phase"; import { SwitchType } from "#enums/switch-type"; @@ -54,7 +53,6 @@ export class CheckSwitchPhase extends BattlePhase { this.scene.ui.showText(i18next.t("battle:switchQuestion", { pokemonName: this.useName ? getPokemonNameWithAffix(pokemon) : i18next.t("battle:pokemon") }), null, () => { this.scene.ui.setMode(Mode.CONFIRM, () => { this.scene.ui.setMode(Mode.MESSAGE); - this.scene.tryRemovePhase(p => p instanceof PostSummonPhase && p.player && p.fieldIndex === this.fieldIndex); this.scene.unshiftPhase(new SwitchPhase(this.scene, SwitchType.INITIAL_SWITCH, this.fieldIndex, false, true)); this.end(); }, () => { diff --git a/src/phases/damage-phase.ts b/src/phases/damage-anim-phase.ts similarity index 82% rename from src/phases/damage-phase.ts rename to src/phases/damage-anim-phase.ts index 44e3dfd4182..42f0e1ba845 100644 --- a/src/phases/damage-phase.ts +++ b/src/phases/damage-anim-phase.ts @@ -1,11 +1,11 @@ -import BattleScene from "#app/battle-scene"; -import { BattlerIndex } from "#app/battle"; -import { BattleSpec } from "#app/enums/battle-spec"; -import { DamageResult, HitResult } from "#app/field/pokemon"; -import * as Utils from "#app/utils"; -import { PokemonPhase } from "./pokemon-phase"; +import type BattleScene from "#app/battle-scene"; +import { type BattlerIndex } from "#app/battle"; +import { BattleSpec } from "#enums/battle-spec"; +import { type DamageResult, HitResult } from "#app/field/pokemon"; +import { fixedInt } from "#app/utils"; +import { PokemonPhase } from "#app/phases/pokemon-phase"; -export class DamagePhase extends PokemonPhase { +export class DamageAnimPhase extends PokemonPhase { private amount: integer; private damageResult: DamageResult; private critical: boolean; @@ -25,7 +25,7 @@ export class DamagePhase extends PokemonPhase { if (this.scene.moveAnimations) { this.scene.toggleInvert(true); } - this.scene.time.delayedCall(Utils.fixedInt(1000), () => { + this.scene.time.delayedCall(fixedInt(1000), () => { this.scene.toggleInvert(false); this.applyDamage(); }); diff --git a/src/phases/egg-hatch-phase.ts b/src/phases/egg-hatch-phase.ts index 90aceeb46bc..803fd478fd4 100644 --- a/src/phases/egg-hatch-phase.ts +++ b/src/phases/egg-hatch-phase.ts @@ -14,6 +14,7 @@ import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; import * as Utils from "#app/utils"; import { EggLapsePhase } from "./egg-lapse-phase"; import { EggHatchData } from "#app/data/egg-hatch-data"; +import { doShinySparkleAnim } from "#app/field/anims"; /** @@ -329,7 +330,12 @@ export class EggHatchPhase extends Phase { this.scene.validateAchv(achvs.HATCH_SHINY); } this.eggContainer.setVisible(false); - this.pokemonSprite.play(this.pokemon.getSpriteKey(true)); + const spriteKey = this.pokemon.getSpriteKey(true); + try { + this.pokemonSprite.play(spriteKey); + } catch (err: unknown) { + console.error(`Failed to play animation for ${spriteKey}`, err); + } this.pokemonSprite.setPipelineData("ignoreTimeTint", true); this.pokemonSprite.setPipelineData("spriteKey", this.pokemon.getSpriteKey()); this.pokemonSprite.setPipelineData("shiny", this.pokemon.shiny); @@ -341,8 +347,7 @@ export class EggHatchPhase extends Phase { this.pokemon.cry(); if (isShiny) { this.scene.time.delayedCall(Utils.fixedInt(500), () => { - this.pokemonShinySparkle.play(`sparkle${this.pokemon.variant ? `_${this.pokemon.variant + 1}` : ""}`); - this.scene.playSound("se/sparkle"); + doShinySparkleAnim(this.scene, this.pokemonShinySparkle, this.pokemon.variant); }); } this.scene.time.delayedCall(Utils.fixedInt(!this.skipped ? !isShiny ? 1250 : 1750 : !isShiny ? 250 : 750), () => { diff --git a/src/phases/egg-lapse-phase.ts b/src/phases/egg-lapse-phase.ts index 4c57be09b79..8de26ee3ef0 100644 --- a/src/phases/egg-lapse-phase.ts +++ b/src/phases/egg-lapse-phase.ts @@ -34,7 +34,7 @@ export class EggLapsePhase extends Phase { if (eggsToHatchCount >= this.minEggsToSkip && this.scene.eggSkipPreference === 1) { this.scene.ui.showText(i18next.t("battle:eggHatching"), 0, () => { // show prompt for skip, blocking inputs for 1 second - this.scene.ui.showText(i18next.t("battle:eggSkipPrompt"), 0); + this.scene.ui.showText(i18next.t("battle:eggSkipPrompt", { eggsToHatch: eggsToHatchCount }), 0); this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => { this.hatchEggsSkipped(eggsToHatch); this.showSummary(); diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index 03126ba81bb..a4c9aa44b36 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -34,6 +34,7 @@ import { Biome } from "#enums/biome"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; +import { overrideHeldItems, overrideModifiers } from "#app/modifier/modifier"; import i18next from "i18next"; import { WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; @@ -216,6 +217,11 @@ export class EncounterPhase extends BattlePhase { if (!this.loaded && battle.battleType !== BattleType.MYSTERY_ENCOUNTER) { regenerateModifierPoolThresholds(this.scene.getEnemyField(), battle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD); this.scene.generateEnemyModifiers(); + overrideModifiers(this.scene, false); + this.scene.getEnemyField().forEach(enemy => { + overrideHeldItems(this.scene, enemy, false); + }); + } this.scene.ui.setMode(Mode.MESSAGE).then(() => { @@ -379,6 +385,9 @@ export class EncounterPhase extends BattlePhase { if (encounter.onVisualsStart) { encounter.onVisualsStart(this.scene); + } else if (encounter.spriteConfigs && introVisuals) { + // If the encounter doesn't have any special visual intro, show sparkle for shiny Pokemon + introVisuals.playShinySparkles(); } const doEncounter = () => { diff --git a/src/phases/evolution-phase.ts b/src/phases/evolution-phase.ts index 01994263688..76e521c9b3d 100644 --- a/src/phases/evolution-phase.ts +++ b/src/phases/evolution-phase.ts @@ -1,17 +1,18 @@ import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; import { Phase } from "#app/phase"; import BattleScene, { AnySound } from "#app/battle-scene"; -import { SpeciesFormEvolution } from "#app/data/balance/pokemon-evolutions"; +import { FusionSpeciesFormEvolution, SpeciesFormEvolution } from "#app/data/balance/pokemon-evolutions"; import EvolutionSceneHandler from "#app/ui/evolution-scene-handler"; import * as Utils from "#app/utils"; import { Mode } from "#app/ui/ui"; import { cos, sin } from "#app/field/anims"; -import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; +import Pokemon, { LearnMoveSituation, PlayerPokemon } from "#app/field/pokemon"; import { getTypeRgb } from "#app/data/type"; import i18next from "i18next"; import { getPokemonNameWithAffix } from "#app/messages"; import { LearnMovePhase } from "#app/phases/learn-move-phase"; import { EndEvolutionPhase } from "#app/phases/end-evolution-phase"; +import { EVOLVE_MOVE } from "#app/data/balance/pokemon-level-moves"; export class EvolutionPhase extends Phase { protected pokemon: PlayerPokemon; @@ -20,6 +21,7 @@ export class EvolutionPhase extends Phase { private preEvolvedPokemonName: string; private evolution: SpeciesFormEvolution | null; + private fusionSpeciesEvolved: boolean; // Whether the evolution is of the fused species private evolutionBgm: AnySound; private evolutionHandler: EvolutionSceneHandler; @@ -39,6 +41,7 @@ export class EvolutionPhase extends Phase { this.pokemon = pokemon; this.evolution = evolution; this.lastLevel = lastLevel; + this.fusionSpeciesEvolved = evolution instanceof FusionSpeciesFormEvolution; } validate(): boolean { @@ -102,7 +105,13 @@ export class EvolutionPhase extends Phase { this.scene.ui.add(this.evolutionOverlay); [ this.pokemonSprite, this.pokemonTintSprite, this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => { - sprite.play(this.pokemon.getSpriteKey(true)); + const spriteKey = this.pokemon.getSpriteKey(true); + try { + sprite.play(spriteKey); + } catch (err: unknown) { + console.error(`Failed to play animation for ${spriteKey}`, err); + } + sprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(this.pokemon.getTeraType()) }); sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", this.pokemon.getSpriteKey()); @@ -127,7 +136,13 @@ export class EvolutionPhase extends Phase { this.pokemon.getPossibleEvolution(this.evolution).then(evolvedPokemon => { [ this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => { - sprite.play(evolvedPokemon.getSpriteKey(true)); + const spriteKey = evolvedPokemon.getSpriteKey(true); + try { + sprite.play(spriteKey); + } catch (err: unknown) { + console.error(`Failed to play animation for ${spriteKey}`, err); + } + sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", evolvedPokemon.getSpriteKey()); sprite.setPipelineData("shiny", evolvedPokemon.shiny); @@ -261,7 +276,8 @@ export class EvolutionPhase extends Phase { this.evolutionHandler.canCancel = false; this.pokemon.evolve(this.evolution, this.pokemon.species).then(() => { - const levelMoves = this.pokemon.getLevelMoves(this.lastLevel + 1, true); + const learnSituation: LearnMoveSituation = this.fusionSpeciesEvolved ? LearnMoveSituation.EVOLUTION_FUSED : this.pokemon.fusionSpecies ? LearnMoveSituation.EVOLUTION_FUSED_BASE : LearnMoveSituation.EVOLUTION; + const levelMoves = this.pokemon.getLevelMoves(this.lastLevel + 1, true, false, false, learnSituation).filter(lm => lm[0] === EVOLVE_MOVE); for (const lm of levelMoves) { this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.scene.getPlayerParty().indexOf(this.pokemon), lm[1])); } diff --git a/src/phases/faint-phase.ts b/src/phases/faint-phase.ts index 1c48bdfb37a..a0c10015fbf 100644 --- a/src/phases/faint-phase.ts +++ b/src/phases/faint-phase.ts @@ -12,7 +12,7 @@ import { getPokemonNameWithAffix } from "#app/messages"; import { PokemonInstantReviveModifier } from "#app/modifier/modifier"; import { SwitchType } from "#enums/switch-type"; import i18next from "i18next"; -import { DamagePhase } from "./damage-phase"; +import { DamageAnimPhase } from "./damage-anim-phase"; import { GameOverPhase } from "./game-over-phase"; import { PokemonPhase } from "./pokemon-phase"; import { SwitchPhase } from "./switch-phase"; @@ -206,7 +206,7 @@ export class FaintPhase extends PokemonPhase { } else { // Final boss' HP threshold has been bypassed; cancel faint and force check for 2nd phase enemy.hp++; - this.scene.unshiftPhase(new DamagePhase(this.scene, enemy.getBattlerIndex(), 0, HitResult.OTHER)); + this.scene.unshiftPhase(new DamageAnimPhase(this.scene, enemy.getBattlerIndex(), 0, HitResult.OTHER)); this.end(); } return true; diff --git a/src/phases/form-change-phase.ts b/src/phases/form-change-phase.ts index 410163a70e4..b042cd98294 100644 --- a/src/phases/form-change-phase.ts +++ b/src/phases/form-change-phase.ts @@ -39,7 +39,13 @@ export class FormChangePhase extends EvolutionPhase { this.pokemon.getPossibleForm(this.formChange).then(transformedPokemon => { [ this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => { - sprite.play(transformedPokemon.getSpriteKey(true)); + const spriteKey = transformedPokemon.getSpriteKey(true); + try { + sprite.play(spriteKey); + } catch (err: unknown) { + console.error(`Failed to play animation for ${spriteKey}`, err); + } + sprite.setPipelineData("ignoreTimeTint", true); sprite.setPipelineData("spriteKey", transformedPokemon.getSpriteKey()); sprite.setPipelineData("shiny", transformedPokemon.shiny); diff --git a/src/phases/game-over-phase.ts b/src/phases/game-over-phase.ts index 84a4a4e8ef9..52d0996b946 100644 --- a/src/phases/game-over-phase.ts +++ b/src/phases/game-over-phase.ts @@ -23,6 +23,12 @@ import * as Utils from "#app/utils"; import { PlayerGender } from "#enums/player-gender"; import { TrainerType } from "#enums/trainer-type"; import i18next from "i18next"; +import { SessionSaveData } from "#app/system/game-data"; +import PersistentModifierData from "#app/system/modifier-data"; +import PokemonData from "#app/system/pokemon-data"; +import ChallengeData from "#app/system/challenge-data"; +import TrainerData from "#app/system/trainer-data"; +import ArenaData from "#app/system/arena-data"; import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; export class GameOverPhase extends BattlePhase { @@ -109,7 +115,7 @@ export class GameOverPhase extends BattlePhase { this.scene.gameData.gameStats.dailyRunSessionsWon++; } } - this.scene.gameData.saveRunHistory(this.scene, this.scene.gameData.getSessionSaveData(this.scene), this.isVictory); + const fadeDuration = this.isVictory ? 10000 : 5000; this.scene.fadeOutBgm(fadeDuration, true); const activeBattlers = this.scene.getField().filter(p => p?.isActive(true)); @@ -135,8 +141,11 @@ export class GameOverPhase extends BattlePhase { this.scene.unshiftPhase(new GameOverModifierRewardPhase(this.scene, modifierTypes.VOUCHER_PREMIUM)); } } - this.scene.pushPhase(new PostGameOverPhase(this.scene, endCardPhase)); - this.end(); + this.getRunHistoryEntry().then(runHistoryEntry => { + this.scene.gameData.saveRunHistory(this.scene, runHistoryEntry, this.isVictory); + this.scene.pushPhase(new PostGameOverPhase(this.scene, endCardPhase)); + this.end(); + }); }; if (this.isVictory && this.scene.gameMode.isClassic) { @@ -212,5 +221,34 @@ export class GameOverPhase extends BattlePhase { this.firstRibbons.push(getPokemonSpecies(pokemon.species.getRootSpeciesId(forStarter))); } } + + /** + * Slightly modified version of {@linkcode GameData.getSessionSaveData}. + * @returns A promise containing the {@linkcode SessionSaveData} + */ + private async getRunHistoryEntry(): Promise { + const preWaveSessionData = await this.scene.gameData.getSession(this.scene.sessionSlotId); + return { + seed: this.scene.seed, + playTime: this.scene.sessionPlayTime, + gameMode: this.scene.gameMode.modeId, + party: this.scene.getPlayerParty().map(p => new PokemonData(p)), + enemyParty: this.scene.getEnemyParty().map(p => new PokemonData(p)), + modifiers: preWaveSessionData ? preWaveSessionData.modifiers : this.scene.findModifiers(() => true).map(m => new PersistentModifierData(m, true)), + enemyModifiers: preWaveSessionData ? preWaveSessionData.enemyModifiers : this.scene.findModifiers(() => true, false).map(m => new PersistentModifierData(m, false)), + arena: new ArenaData(this.scene.arena), + pokeballCounts: this.scene.pokeballCounts, + money: Math.floor(this.scene.money), + score: this.scene.score, + waveIndex: this.scene.currentBattle.waveIndex, + battleType: this.scene.currentBattle.battleType, + trainer: this.scene.currentBattle.trainer ? new TrainerData(this.scene.currentBattle.trainer) : null, + gameVersion: this.scene.game.config.gameVersion, + timestamp: new Date().getTime(), + challenges: this.scene.gameMode.challenges.map(c => new ChallengeData(c)), + mysteryEncounterType: this.scene.currentBattle.mysteryEncounter?.encounterType ?? -1, + mysteryEncounterSaveData: this.scene.mysteryEncounterSaveData + } as SessionSaveData; + } } diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index f7a9b22c396..d08fc46e563 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -4,11 +4,13 @@ import { AddSecondStrikeAbAttr, AlwaysHitAbAttr, applyPostAttackAbAttrs, + applyPostDamageAbAttrs, applyPostDefendAbAttrs, applyPreAttackAbAttrs, IgnoreMoveEffectsAbAttr, MaxMultiHitAbAttr, PostAttackAbAttr, + PostDamageAbAttr, PostDefendAbAttr, TypeImmunityAbAttr, } from "#app/data/ability"; @@ -54,7 +56,7 @@ import { PokemonMultiHitModifier, } from "#app/modifier/modifier"; import { PokemonPhase } from "#app/phases/pokemon-phase"; -import { BooleanHolder, executeIf, NumberHolder } from "#app/utils"; +import { BooleanHolder, executeIf, isNullOrUndefined, NumberHolder } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import i18next from "i18next"; @@ -104,7 +106,9 @@ export class MoveEffectPhase extends PokemonPhase { */ return super.end(); } - user.resetTurnData(); + if (isNullOrUndefined(user.turnData)) { + user.resetTurnData(); + } } } @@ -125,6 +129,14 @@ export class MoveEffectPhase extends PokemonPhase { user.lapseTags(BattlerTagLapseType.MOVE_EFFECT); + // If the user is acting again (such as due to Instruct), reset hitsLeft/hitCount so that + // the move executes correctly (ensures all hits of a multi-hit are properly calculated) + if (user.turnData.hitsLeft === 0 && user.turnData.hitCount > 0 && user.turnData.extraTurns > 0) { + user.turnData.hitsLeft = -1; + user.turnData.hitCount = 0; + user.turnData.extraTurns--; + } + /** * If this phase is for the first hit of the invoked move, * resolve the move's total hit count. This block combines the @@ -228,9 +240,11 @@ export class MoveEffectPhase extends PokemonPhase { * If the move missed a target, stop all future hits against that target * and move on to the next target (if there is one). */ - if (isCommanding || (!isImmune && !isProtected && !targetHitChecks[target.getBattlerIndex()])) { + if (target.switchOutStatus || isCommanding || (!isImmune && !isProtected && !targetHitChecks[target.getBattlerIndex()])) { this.stopMultiHit(target); - this.scene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: getPokemonNameWithAffix(target) })); + if (!target.switchOutStatus) { + this.scene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: getPokemonNameWithAffix(target) })); + } if (moveHistoryEntry.result === MoveResult.PENDING) { moveHistoryEntry.result = MoveResult.MISS; } @@ -299,10 +313,17 @@ export class MoveEffectPhase extends PokemonPhase { */ if (lastHit) { this.scene.triggerPokemonFormChange(user, SpeciesFormChangePostMoveTrigger); + /** + * Multi-Lens, Multi Hit move and Parental Bond check for PostDamageAbAttr + * other damage source are calculated in damageAndUpdate in pokemon.ts + */ + if (user.turnData.hitCount > 1) { + applyPostDamageAbAttrs(PostDamageAbAttr, target, 0, target.hasPassive(), false, [], user); + } } /** - * Create a Promise that applys *all* effects from the invoked move's MoveEffectAttrs. + * Create a Promise that applies *all* effects from the invoked move's MoveEffectAttrs. * These are ordered by trigger type (see {@linkcode MoveEffectTrigger}), and each trigger * type requires different conditions to be met with respect to the move's hit result. */ diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index 005cdbe1716..089386bee00 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -529,7 +529,7 @@ export class MovePhase extends BattlePhase { * Displays the move's usage text to the player, unless it's a charge turn (ie: {@link Moves.SOLAR_BEAM Solar Beam}), * the pokemon is on a recharge turn (ie: {@link Moves.HYPER_BEAM Hyper Beam}), or a 2-turn move was interrupted (ie: {@link Moves.FLY Fly}). */ - protected showMoveText(): void { + public showMoveText(): void { if (this.move.moveId === Moves.NONE) { return; } @@ -545,7 +545,7 @@ export class MovePhase extends BattlePhase { applyMoveAttrs(PreMoveMessageAttr, this.pokemon, this.pokemon.getOpponents()[0], this.move.getMove()); } - protected showFailedText(failedText?: string): void { + public showFailedText(failedText?: string): void { this.scene.queueMessage(failedText ?? i18next.t("battle:attackFailed")); } } diff --git a/src/phases/post-summon-phase.ts b/src/phases/post-summon-phase.ts index 644a6235a42..42e5b930eb1 100644 --- a/src/phases/post-summon-phase.ts +++ b/src/phases/post-summon-phase.ts @@ -27,9 +27,12 @@ export class PostSummonPhase extends PokemonPhase { pokemon.lapseTag(BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON); } - applyPostSummonAbAttrs(PostSummonAbAttr, pokemon).then(() => this.end()); + applyPostSummonAbAttrs(PostSummonAbAttr, pokemon) + .then(() => { + const field = pokemon.isPlayer() ? this.scene.getPlayerField() : this.scene.getEnemyField(); + field.forEach((p) => applyAbAttrs(CommanderAbAttr, p, null, false)); - const field = pokemon.isPlayer() ? this.scene.getPlayerField() : this.scene.getEnemyField(); - field.forEach((p) => applyAbAttrs(CommanderAbAttr, p, null, false)); + this.end(); + }); } } diff --git a/src/phases/post-turn-status-effect-phase.ts b/src/phases/post-turn-status-effect-phase.ts index 08e4d7cb952..378a932cdc5 100644 --- a/src/phases/post-turn-status-effect-phase.ts +++ b/src/phases/post-turn-status-effect-phase.ts @@ -16,7 +16,7 @@ export class PostTurnStatusEffectPhase extends PokemonPhase { start() { const pokemon = this.getPokemon(); - if (pokemon?.isActive(true) && pokemon.status && pokemon.status.isPostTurn()) { + if (pokemon?.isActive(true) && pokemon.status && pokemon.status.isPostTurn() && !pokemon.switchOutStatus) { pokemon.status.incrementTurn(); const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); diff --git a/src/phases/quiet-form-change-phase.ts b/src/phases/quiet-form-change-phase.ts index 6c84c0d1a8a..c9e5bec845d 100644 --- a/src/phases/quiet-form-change-phase.ts +++ b/src/phases/quiet-form-change-phase.ts @@ -43,7 +43,12 @@ export class QuietFormChangePhase extends BattlePhase { const getPokemonSprite = () => { const sprite = this.scene.addPokemonSprite(this.pokemon, this.pokemon.x + this.pokemon.getSprite().x, this.pokemon.y + this.pokemon.getSprite().y, "pkmn__sub"); sprite.setOrigin(0.5, 1); - sprite.play(this.pokemon.getBattleSpriteKey()).stop(); + const spriteKey = this.pokemon.getBattleSpriteKey(); + try { + sprite.play(spriteKey).stop(); + } catch (err: unknown) { + console.error(`Failed to play animation for ${spriteKey}`, err); + } sprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(this.pokemon.getTeraType()) }); [ "spriteColors", "fusionSpriteColors" ].map(k => { if (this.pokemon.summonData?.speciesForm) { @@ -81,7 +86,12 @@ export class QuietFormChangePhase extends BattlePhase { this.pokemon.setVisible(false); this.pokemon.changeForm(this.formChange).then(() => { pokemonFormTintSprite.setScale(0.01); - pokemonFormTintSprite.play(this.pokemon.getBattleSpriteKey()).stop(); + const spriteKey = this.pokemon.getBattleSpriteKey(); + try { + pokemonFormTintSprite.play(spriteKey).stop(); + } catch (err: unknown) { + console.error(`Failed to play animation for ${spriteKey}`, err); + } pokemonFormTintSprite.setVisible(true); this.scene.tweens.add({ targets: pokemonTintSprite, diff --git a/src/phases/switch-phase.ts b/src/phases/switch-phase.ts index 2abb109a529..481d64c451e 100644 --- a/src/phases/switch-phase.ts +++ b/src/phases/switch-phase.ts @@ -3,6 +3,7 @@ import PartyUiHandler, { PartyOption, PartyUiMode } from "#app/ui/party-ui-handl import { Mode } from "#app/ui/ui"; import { SwitchType } from "#enums/switch-type"; import { BattlePhase } from "./battle-phase"; +import { PostSummonPhase } from "./post-summon-phase"; import { SwitchSummonPhase } from "./switch-summon-phase"; /** @@ -63,6 +64,9 @@ export class SwitchPhase extends BattlePhase { this.scene.ui.setMode(Mode.PARTY, this.isModal ? PartyUiMode.FAINT_SWITCH : PartyUiMode.POST_BATTLE_SWITCH, fieldIndex, (slotIndex: integer, option: PartyOption) => { if (slotIndex >= this.scene.currentBattle.getBattlerCount() && slotIndex < 6) { + // Remove any pre-existing PostSummonPhase under the same field index. + // Pre-existing PostSummonPhases may occur when this phase is invoked during a prompt to switch at the start of a wave. + this.scene.tryRemovePhase(p => p instanceof PostSummonPhase && p.player && p.fieldIndex === this.fieldIndex); const switchType = (option === PartyOption.PASS_BATON) ? SwitchType.BATON_PASS : this.switchType; this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, switchType, fieldIndex, slotIndex, this.doReturn)); } diff --git a/src/phases/switch-summon-phase.ts b/src/phases/switch-summon-phase.ts index a667e17edf1..a1925768d83 100644 --- a/src/phases/switch-summon-phase.ts +++ b/src/phases/switch-summon-phase.ts @@ -1,5 +1,5 @@ import BattleScene from "#app/battle-scene"; -import { applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr } from "#app/data/ability"; +import { applyPreSwitchOutAbAttrs, PostDamageForceSwitchAbAttr, PreSwitchOutAbAttr } from "#app/data/ability"; import { allMoves, ForceSwitchOutAttr } from "#app/data/move"; import { getPokeballTintColor } from "#app/data/pokeball"; import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; @@ -166,10 +166,11 @@ export class SwitchSummonPhase extends SummonPhase { const currentCommand = pokemon.scene.currentBattle.turnCommands[this.fieldIndex]?.command; const lastPokemonIsForceSwitchedAndNotFainted = lastUsedMove?.hasAttr(ForceSwitchOutAttr) && !this.lastPokemon.isFainted(); + const lastPokemonHasForceSwitchAbAttr = this.lastPokemon.hasAbilityWithAttr(PostDamageForceSwitchAbAttr) && !this.lastPokemon.isFainted(); // Compensate for turn spent summoning // Or compensate for force switch move if switched out pokemon is not fainted - if (currentCommand === Command.POKEMON || lastPokemonIsForceSwitchedAndNotFainted) { + if (currentCommand === Command.POKEMON || lastPokemonIsForceSwitchedAndNotFainted || lastPokemonHasForceSwitchAbAttr) { pokemon.battleSummonData.turnCount--; pokemon.battleSummonData.waveTurnCount--; } diff --git a/src/phases/trainer-victory-phase.ts b/src/phases/trainer-victory-phase.ts index dc1b962f47e..d797e4360ac 100644 --- a/src/phases/trainer-victory-phase.ts +++ b/src/phases/trainer-victory-phase.ts @@ -9,6 +9,8 @@ import { BattlePhase } from "./battle-phase"; import { ModifierRewardPhase } from "./modifier-reward-phase"; import { MoneyRewardPhase } from "./money-reward-phase"; import { TrainerSlot } from "#app/data/trainer-config"; +import { Biome } from "#app/enums/biome"; +import { achvs } from "#app/system/achv"; export class TrainerVictoryPhase extends BattlePhase { constructor(scene: BattleScene) { @@ -34,11 +36,17 @@ export class TrainerVictoryPhase extends BattlePhase { } const trainerType = this.scene.currentBattle.trainer?.config.trainerType!; // TODO: is this bang correct? + // Validate Voucher for boss trainers if (vouchers.hasOwnProperty(TrainerType[trainerType])) { if (!this.scene.validateVoucher(vouchers[TrainerType[trainerType]]) && this.scene.currentBattle.trainer?.config.isBoss) { this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, [ modifierTypes.VOUCHER, modifierTypes.VOUCHER, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM ][vouchers[TrainerType[trainerType]].voucherType])); } } + // Breeders in Space achievement + if (this.scene.arena.biomeType === Biome.SPACE + && (trainerType === TrainerType.BREEDER || trainerType === TrainerType.EXPERT_POKEMON_BREEDER)) { + this.scene.validateAchv(achvs.BREEDERS_IN_SPACE); + } this.scene.ui.showText(i18next.t("battle:trainerDefeated", { trainerName: this.scene.currentBattle.trainer?.getName(TrainerSlot.NONE, true) }), null, () => { const victoryMessages = this.scene.currentBattle.trainer?.getVictoryMessages()!; // TODO: is this bang correct? diff --git a/src/phases/turn-end-phase.ts b/src/phases/turn-end-phase.ts index 60a2e6600db..e5f1850758d 100644 --- a/src/phases/turn-end-phase.ts +++ b/src/phases/turn-end-phase.ts @@ -23,22 +23,24 @@ export class TurnEndPhase extends FieldPhase { this.scene.eventTarget.dispatchEvent(new TurnEndEvent(this.scene.currentBattle.turn)); const handlePokemon = (pokemon: Pokemon) => { - pokemon.lapseTags(BattlerTagLapseType.TURN_END); + if (!pokemon.switchOutStatus) { + pokemon.lapseTags(BattlerTagLapseType.TURN_END); - this.scene.applyModifiers(TurnHealModifier, pokemon.isPlayer(), pokemon); + this.scene.applyModifiers(TurnHealModifier, pokemon.isPlayer(), pokemon); - if (this.scene.arena.terrain?.terrainType === TerrainType.GRASSY && pokemon.isGrounded()) { - this.scene.unshiftPhase(new PokemonHealPhase(this.scene, pokemon.getBattlerIndex(), - Math.max(pokemon.getMaxHp() >> 4, 1), i18next.t("battle:turnEndHpRestore", { pokemonName: getPokemonNameWithAffix(pokemon) }), true)); + if (this.scene.arena.terrain?.terrainType === TerrainType.GRASSY && pokemon.isGrounded()) { + this.scene.unshiftPhase(new PokemonHealPhase(this.scene, pokemon.getBattlerIndex(), + Math.max(pokemon.getMaxHp() >> 4, 1), i18next.t("battle:turnEndHpRestore", { pokemonName: getPokemonNameWithAffix(pokemon) }), true)); + } + + if (!pokemon.isPlayer()) { + this.scene.applyModifiers(EnemyTurnHealModifier, false, pokemon); + this.scene.applyModifier(EnemyStatusEffectHealChanceModifier, false, pokemon); + } + + applyPostTurnAbAttrs(PostTurnAbAttr, pokemon); } - if (!pokemon.isPlayer()) { - this.scene.applyModifiers(EnemyTurnHealModifier, false, pokemon); - this.scene.applyModifier(EnemyStatusEffectHealChanceModifier, false, pokemon); - } - - applyPostTurnAbAttrs(PostTurnAbAttr, pokemon); - this.scene.applyModifiers(TurnStatusEffectModifier, pokemon.isPlayer(), pokemon); this.scene.applyModifiers(TurnHeldItemTransferModifier, pokemon.isPlayer(), pokemon); diff --git a/src/phases/victory-phase.ts b/src/phases/victory-phase.ts index 1faa31655df..62479241a6c 100644 --- a/src/phases/victory-phase.ts +++ b/src/phases/victory-phase.ts @@ -41,7 +41,7 @@ export class VictoryPhase extends PokemonPhase { } if (!this.scene.getEnemyParty().find(p => this.scene.currentBattle.battleType === BattleType.WILD ? p.isOnField() : !p?.isFainted(true))) { - this.scene.pushPhase(new BattleEndPhase(this.scene)); + this.scene.pushPhase(new BattleEndPhase(this.scene, true)); if (this.scene.currentBattle.battleType === BattleType.TRAINER) { this.scene.pushPhase(new TrainerVictoryPhase(this.scene)); } diff --git a/src/phases/weather-effect-phase.ts b/src/phases/weather-effect-phase.ts index b48ee342780..442bafa0ca7 100644 --- a/src/phases/weather-effect-phase.ts +++ b/src/phases/weather-effect-phase.ts @@ -51,7 +51,7 @@ export class WeatherEffectPhase extends CommonAnimPhase { }; this.executeForAll((pokemon: Pokemon) => { - const immune = !pokemon || !!pokemon.getTypes(true, true).filter(t => this.weather?.isTypeDamageImmune(t)).length; + const immune = !pokemon || !!pokemon.getTypes(true, true).filter(t => this.weather?.isTypeDamageImmune(t)).length || pokemon.switchOutStatus; if (!immune) { inflictDamage(pokemon); } @@ -59,8 +59,12 @@ export class WeatherEffectPhase extends CommonAnimPhase { } } - this.scene.ui.showText(getWeatherLapseMessage(this.weather.weatherType)!, null, () => { // TODO: is this bang correct? - this.executeForAll((pokemon: Pokemon) => applyPostWeatherLapseAbAttrs(PostWeatherLapseAbAttr, pokemon, this.weather)); + this.scene.ui.showText(getWeatherLapseMessage(this.weather.weatherType) ?? "", null, () => { + this.executeForAll((pokemon: Pokemon) => { + if (!pokemon.switchOutStatus) { + applyPostWeatherLapseAbAttrs(PostWeatherLapseAbAttr, pokemon, this.weather); + } + }); super.start(); }); diff --git a/src/system/achv.ts b/src/system/achv.ts index d94fcba48f2..a98e396264d 100644 --- a/src/system/achv.ts +++ b/src/system/achv.ts @@ -358,7 +358,7 @@ export const achvs = { MONO_FAIRY: new ChallengeAchv("MONO_FAIRY", "", "MONO_FAIRY.description", "fairy_feather", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 18 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), FRESH_START: new ChallengeAchv("FRESH_START", "", "FRESH_START.description", "reviver_seed", 100, (c, scene) => c instanceof FreshStartChallenge && c.value > 0 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)), INVERSE_BATTLE: new ChallengeAchv("INVERSE_BATTLE", "", "INVERSE_BATTLE.description", "inverse", 100, c => c instanceof InverseBattleChallenge && c.value > 0), - BREEDERS_IN_SPACE: new Achv("BREEDERS_IN_SPACE", "", "BREEDERS_IN_SPACE.description", "moon_stone", 100).setSecret(), + BREEDERS_IN_SPACE: new Achv("BREEDERS_IN_SPACE", "", "BREEDERS_IN_SPACE.description", "moon_stone", 50).setSecret(), }; export function initAchievements() { diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 443382186c7..64801cc0ff1 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -171,7 +171,7 @@ export default class PokemonData { playerPokemon.nickname = this.nickname; } }) - : scene.addEnemyPokemon(species, this.level, battleType === BattleType.TRAINER ? !double || !(partyMemberIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER : TrainerSlot.NONE, this.boss, this); + : scene.addEnemyPokemon(species, this.level, battleType === BattleType.TRAINER ? !double || !(partyMemberIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER : TrainerSlot.NONE, this.boss, false, this); if (this.summonData) { ret.primeSummonData(this.summonData); } diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index d71edf603dd..64ddfdae5cf 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -1,9 +1,9 @@ import { Mode } from "#app/ui/ui"; import i18next from "i18next"; -import BattleScene from "../../battle-scene"; -import { hasTouchscreen } from "../../touch-controls"; -import { updateWindowType } from "../../ui/ui-theme"; -import { CandyUpgradeNotificationChangedEvent } from "../../events/battle-scene"; +import BattleScene from "#app/battle-scene"; +import { hasTouchscreen } from "#app/touch-controls"; +import { updateWindowType } from "#app/ui/ui-theme"; +import { CandyUpgradeNotificationChangedEvent } from "#app/events/battle-scene"; import SettingsUiHandler from "#app/ui/settings/settings-ui-handler"; import { EaseType } from "#enums/ease-type"; import { MoneyFormat } from "#enums/money-format"; @@ -44,6 +44,7 @@ const OFF_ON: SettingOption[] = [ label: i18next.t("settings:on") } ]; + const AUTO_DISABLED: SettingOption[] = [ { value: "Auto", @@ -55,6 +56,19 @@ const AUTO_DISABLED: SettingOption[] = [ } ]; +const TOUCH_CONTROLS_OPTIONS: SettingOption[] = [ + { + value: "Auto", + label: i18next.t("settings:auto") + }, + { + value: "Disabled", + label: i18next.t("settings:disabled"), + needConfirmation: true, + confirmationMessage: i18next.t("settings:confirmDisableTouch") + } +]; + const SHOP_CURSOR_TARGET_OPTIONS: SettingOption[] = [ { value: "Rewards", @@ -100,7 +114,9 @@ export enum SettingType { type SettingOption = { value: string, - label: string + label: string, + needConfirmation?: boolean, + confirmationMessage?: string }; export interface Setting { @@ -344,13 +360,6 @@ export const Setting: Array = [ default: 1, type: SettingType.GENERAL }, - { - key: SettingKeys.Touch_Controls, - label: i18next.t("settings:touchControls"), - options: AUTO_DISABLED, - default: 0, - type: SettingType.GENERAL - }, { key: SettingKeys.Vibration, label: i18next.t("settings:vibrations"), @@ -358,6 +367,28 @@ export const Setting: Array = [ default: 0, type: SettingType.GENERAL }, + { + key: SettingKeys.Touch_Controls, + label: i18next.t("settings:touchControls"), + options: TOUCH_CONTROLS_OPTIONS, + default: 0, + type: SettingType.GENERAL, + isHidden: () => !hasTouchscreen() + }, + { + key: SettingKeys.Move_Touch_Controls, + label: i18next.t("settings:moveTouchControls"), + options: [ + { + value: "Configure", + label: i18next.t("settings:change") + } + ], + default: 0, + type: SettingType.GENERAL, + activatable: true, + isHidden: () => !hasTouchscreen() + }, { key: SettingKeys.Language, label: i18next.t("settings:language"), @@ -643,20 +674,6 @@ export const Setting: Array = [ type: SettingType.AUDIO, requireReload: true }, - { - key: SettingKeys.Move_Touch_Controls, - label: i18next.t("settings:moveTouchControls"), - options: [ - { - value: "Configure", - label: i18next.t("settings:change") - } - ], - default: 0, - type: SettingType.GENERAL, - activatable: true, - isHidden: () => !hasTouchscreen() - }, { key: SettingKeys.Shop_Cursor_Target, label: i18next.t("settings:shopCursorTarget"), @@ -849,7 +866,7 @@ export function setSetting(scene: BattleScene, setting: string, value: integer): if (scene.ui) { const cancelHandler = () => { scene.ui.revertMode(); - (scene.ui.getHandler() as SettingsUiHandler).setOptionCursor(0, 0, true); + (scene.ui.getHandler() as SettingsUiHandler).setOptionCursor(-1, 0, true); }; const changeLocaleHandler = (locale: string): boolean => { try { diff --git a/src/test/abilities/analytic.test.ts b/src/test/abilities/analytic.test.ts new file mode 100644 index 00000000000..12777c545f0 --- /dev/null +++ b/src/test/abilities/analytic.test.ts @@ -0,0 +1,81 @@ +import { BattlerIndex } from "#app/battle"; +import { isBetween, toDmgValue } from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Analytic", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH, Moves.TACKLE ]) + .ability(Abilities.ANALYTIC) + .battleType("single") + .disableCrits() + .startingLevel(200) + .enemyLevel(200) + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should increase damage if the user moves last", async () => { + await game.classicMode.startBattle([ Species.ARCEUS ]); + + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.toNextTurn(); + const damage1 = enemy.getInverseHp(); + enemy.hp = enemy.getMaxHp(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to("BerryPhase"); + expect(isBetween(enemy.getInverseHp(), toDmgValue(damage1 * 1.3) - 3, toDmgValue(damage1 * 1.3) + 3)).toBe(true); + }); + + it("should increase damage only if the user moves last in doubles", async () => { + game.override.battleType("double"); + await game.classicMode.startBattle([ Species.GENGAR, Species.SHUCKLE ]); + + const [ enemy, ] = game.scene.getEnemyField(); + + game.move.select(Moves.TACKLE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.toNextTurn(); + const damage1 = enemy.getInverseHp(); + enemy.hp = enemy.getMaxHp(); + + game.move.select(Moves.TACKLE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER ]); + await game.toNextTurn(); + expect(isBetween(enemy.getInverseHp(), toDmgValue(damage1 * 1.3) - 3, toDmgValue(damage1 * 1.3) + 3)).toBe(true); + enemy.hp = enemy.getMaxHp(); + + game.move.select(Moves.TACKLE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2 ]); + await game.phaseInterceptor.to("BerryPhase"); + expect(enemy.getInverseHp()).toBe(damage1); + }); +}); diff --git a/src/test/abilities/arena_trap.test.ts b/src/test/abilities/arena_trap.test.ts index 5068fed6b77..12b9673080d 100644 --- a/src/test/abilities/arena_trap.test.ts +++ b/src/test/abilities/arena_trap.test.ts @@ -1,9 +1,10 @@ +import { allAbilities } from "#app/data/ability"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; describe("Abilities - Arena Trap", () => { let phaserGame: Phaser.Game; @@ -55,4 +56,39 @@ describe("Abilities - Arena Trap", () => { expect(game.scene.getEnemyField().length).toBe(2); }); + + /** + * This checks if the Player Pokemon is able to switch out/run away after the Enemy Pokemon with {@linkcode Abilities.ARENA_TRAP} + * is forcefully moved out of the field from moves such as Roar {@linkcode Moves.ROAR} + * + * Note: It should be able to switch out/run away + */ + it("should lift if pokemon with this ability leaves the field", async () => { + game.override + .battleType("double") + .enemyMoveset(Moves.SPLASH) + .moveset([ Moves.ROAR, Moves.SPLASH ]) + .ability(Abilities.BALL_FETCH); + await game.classicMode.startBattle([ Species.MAGIKARP, Species.SUDOWOODO, Species.LUNATONE ]); + + const [ enemy1, enemy2 ] = game.scene.getEnemyField(); + const [ player1, player2 ] = game.scene.getPlayerField(); + + vi.spyOn(enemy1, "getAbility").mockReturnValue(allAbilities[Abilities.ARENA_TRAP]); + + game.move.select(Moves.ROAR); + game.move.select(Moves.SPLASH, 1); + + // This runs the fist command phase where the moves are selected + await game.toNextTurn(); + // During the next command phase the player pokemons should not be trapped anymore + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.toNextTurn(); + + expect(player1.isTrapped()).toBe(false); + expect(player2.isTrapped()).toBe(false); + expect(enemy1.isOnField()).toBe(false); + expect(enemy2.isOnField()).toBe(true); + }); }); diff --git a/src/test/abilities/forecast.test.ts b/src/test/abilities/forecast.test.ts index 18d43a67a9d..6d1f776da16 100644 --- a/src/test/abilities/forecast.test.ts +++ b/src/test/abilities/forecast.test.ts @@ -2,7 +2,7 @@ import { BattlerIndex } from "#app/battle"; import { allAbilities } from "#app/data/ability"; import { Abilities } from "#app/enums/abilities"; import { WeatherType } from "#app/enums/weather-type"; -import { DamagePhase } from "#app/phases/damage-phase"; +import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { MovePhase } from "#app/phases/move-phase"; import { PostSummonPhase } from "#app/phases/post-summon-phase"; import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase"; @@ -273,7 +273,7 @@ describe("Abilities - Forecast", () => { const castform = game.scene.getPlayerPokemon()!; // Damage phase should come first - await game.phaseInterceptor.to(DamagePhase); + await game.phaseInterceptor.to(DamageAnimPhase); expect(castform.hp).toBeLessThan(castform.getMaxHp()); // Then change form diff --git a/src/test/abilities/honey_gather.test.ts b/src/test/abilities/honey_gather.test.ts new file mode 100644 index 00000000000..fc9d6cdd150 --- /dev/null +++ b/src/test/abilities/honey_gather.test.ts @@ -0,0 +1,74 @@ +import type { CommandPhase } from "#app/phases/command-phase"; +import { Command } from "#app/ui/command-ui-handler"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Abilities - Honey Gather", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH, Moves.ROAR, Moves.THUNDERBOLT ]) + .startingLevel(100) + .ability(Abilities.HONEY_GATHER) + .passiveAbility(Abilities.RUN_AWAY) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should give money when winning a battle", async () => { + await game.classicMode.startBattle([ Species.MILOTIC ]); + game.scene.money = 1000; + + game.move.select(Moves.THUNDERBOLT); + await game.toNextWave(); + + expect(game.scene.money).toBeGreaterThan(1000); + }); + + it("should not give money when the enemy pokemon flees", async () => { + await game.classicMode.startBattle([ Species.MILOTIC ]); + game.scene.money = 1000; + + game.move.select(Moves.ROAR); + await game.toNextTurn(); + + expect(game.scene.money).toBe(1000); + expect(game.scene.currentBattle.waveIndex).toBe(2); + }); + + it("should not give money when the player flees", async () => { + await game.classicMode.startBattle([ Species.MILOTIC ]); + game.scene.money = 1000; + + // something weird is going on with the test framework, so this is required to prevent a crash + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(enemy, "scene", "get").mockReturnValue(game.scene); + + const commandPhase = game.scene.getCurrentPhase() as CommandPhase; + commandPhase.handleCommand(Command.RUN, 0); + await game.toNextTurn(); + + expect(game.scene.money).toBe(1000); + expect(game.scene.currentBattle.waveIndex).toBe(2); + }); +}); diff --git a/src/test/abilities/hustle.test.ts b/src/test/abilities/hustle.test.ts index c4c4818040d..08a441315fb 100644 --- a/src/test/abilities/hustle.test.ts +++ b/src/test/abilities/hustle.test.ts @@ -42,7 +42,7 @@ describe("Abilities - Hustle", () => { game.move.select(Moves.TACKLE); await game.move.forceHit(); - await game.phaseInterceptor.to("DamagePhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); expect(pikachu.getEffectiveStat).toHaveReturnedWith(Math.floor(atk * 1.5)); }); @@ -68,7 +68,7 @@ describe("Abilities - Hustle", () => { vi.spyOn(pikachu, "getAccuracyMultiplier"); game.move.select(Moves.GIGA_DRAIN); - await game.phaseInterceptor.to("DamagePhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); expect(pikachu.getEffectiveStat).toHaveReturnedWith(spatk); expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(1); @@ -86,7 +86,7 @@ describe("Abilities - Hustle", () => { vi.spyOn(allMoves[Moves.FISSURE], "calculateBattleAccuracy"); game.move.select(Moves.FISSURE); - await game.phaseInterceptor.to("DamagePhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); expect(enemyPokemon.turnData.damageTaken).toBe(enemyPokemon.getMaxHp()); expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(1); diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts index 10048a774cd..c2f54fa4cfc 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/src/test/abilities/parental_bond.test.ts @@ -1,5 +1,5 @@ import { Type } from "#enums/type"; -import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { BattlerTagType } from "#enums/battler-tag-type"; import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -8,7 +8,7 @@ import { Stat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Abilities - Parental Bond", () => { @@ -51,7 +51,7 @@ describe("Abilities - Parental Bond", () => { game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to("DamagePhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); const firstStrikeDamage = enemyStartingHp - enemyPokemon.hp; enemyStartingHp = enemyPokemon.hp; @@ -129,7 +129,7 @@ describe("Abilities - Parental Bond", () => { game.move.select(Moves.SELF_DESTRUCT); - await game.phaseInterceptor.to("DamagePhase", false); + await game.phaseInterceptor.to("DamageAnimPhase", false); expect(leadPokemon.turnData.hitCount).toBe(1); } @@ -147,7 +147,7 @@ describe("Abilities - Parental Bond", () => { game.move.select(Moves.ROLLOUT); await game.move.forceHit(); - await game.phaseInterceptor.to("DamagePhase", false); + await game.phaseInterceptor.to("DamageAnimPhase", false); expect(leadPokemon.turnData.hitCount).toBe(1); } @@ -181,7 +181,7 @@ describe("Abilities - Parental Bond", () => { const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.COUNTER); - await game.phaseInterceptor.to("DamagePhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); const playerDamage = leadPokemon.getMaxHp() - leadPokemon.hp; @@ -221,7 +221,7 @@ describe("Abilities - Parental Bond", () => { const leadPokemon = game.scene.getPlayerPokemon()!; game.move.select(Moves.EARTHQUAKE); - await game.phaseInterceptor.to("DamagePhase", false); + await game.phaseInterceptor.to("DamageAnimPhase", false); expect(leadPokemon.turnData.hitCount).toBe(2); } @@ -238,7 +238,7 @@ describe("Abilities - Parental Bond", () => { game.move.select(Moves.MIND_BLOWN); - await game.phaseInterceptor.to("DamagePhase", false); + await game.phaseInterceptor.to("DamageAnimPhase", false); expect(leadPokemon.turnData.hitCount).toBe(2); @@ -285,7 +285,7 @@ describe("Abilities - Parental Bond", () => { game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to("DamagePhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); expect(leadPokemon.turnData.hitCount).toBe(3); } @@ -307,7 +307,7 @@ describe("Abilities - Parental Bond", () => { game.move.select(Moves.SEISMIC_TOSS); await game.move.forceHit(); - await game.phaseInterceptor.to("DamagePhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); expect(leadPokemon.turnData.hitCount).toBe(3); @@ -329,7 +329,7 @@ describe("Abilities - Parental Bond", () => { game.move.select(Moves.HYPER_BEAM); await game.move.forceHit(); - await game.phaseInterceptor.to("DamagePhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); expect(leadPokemon.turnData.hitCount).toBe(2); expect(leadPokemon.getTag(BattlerTagType.RECHARGING)).toBeUndefined(); @@ -353,7 +353,7 @@ describe("Abilities - Parental Bond", () => { game.move.select(Moves.ANCHOR_SHOT); await game.move.forceHit(); - await game.phaseInterceptor.to("DamagePhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); expect(leadPokemon.turnData.hitCount).toBe(2); expect(enemyPokemon.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); @@ -380,7 +380,7 @@ describe("Abilities - Parental Bond", () => { game.move.select(Moves.SMACK_DOWN); await game.move.forceHit(); - await game.phaseInterceptor.to("DamagePhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); expect(leadPokemon.turnData.hitCount).toBe(2); expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); @@ -424,7 +424,7 @@ describe("Abilities - Parental Bond", () => { game.move.select(Moves.WAKE_UP_SLAP); await game.move.forceHit(); - await game.phaseInterceptor.to("DamagePhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); expect(leadPokemon.turnData.hitCount).toBe(2); expect(enemyPokemon.status?.effect).toBe(StatusEffect.SLEEP); @@ -470,4 +470,25 @@ describe("Abilities - Parental Bond", () => { expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(1); } ); + + it("should not allow Future Sight to hit infinitely many times if the user switches out", async () => { + game.override.enemyLevel(1000) + .moveset(Moves.FUTURE_SIGHT); + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "damageAndUpdate"); + + game.move.select(Moves.FUTURE_SIGHT); + await game.toNextTurn(); + + game.doSwitchPokemon(1); + await game.toNextTurn(); + + game.doSwitchPokemon(2); + await game.toNextTurn(); + + // TODO: Update hit count to 1 once Future Sight is fixed to not activate abilities if user is off the field + expect(enemyPokemon.damageAndUpdate).toHaveBeenCalledTimes(2); + }); }); diff --git a/src/test/abilities/serene_grace.test.ts b/src/test/abilities/serene_grace.test.ts index 3318c7fc27a..6f9b2195a9c 100644 --- a/src/test/abilities/serene_grace.test.ts +++ b/src/test/abilities/serene_grace.test.ts @@ -1,15 +1,12 @@ import { BattlerIndex } from "#app/battle"; -import { applyAbAttrs, MoveEffectChanceMultiplierAbAttr } from "#app/data/ability"; -import { Stat } from "#enums/stat"; -import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import * as Utils from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - +import { allMoves } from "#app/data/move"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { FlinchAttr } from "#app/data/move"; describe("Abilities - Serene Grace", () => { let phaserGame: Phaser.Game; @@ -27,66 +24,29 @@ describe("Abilities - Serene Grace", () => { beforeEach(() => { game = new GameManager(phaserGame); - const movesToUse = [ Moves.AIR_SLASH, Moves.TACKLE ]; - game.override.battleType("single"); - game.override.enemySpecies(Species.ONIX); - game.override.startingLevel(100); - game.override.moveset(movesToUse); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + game.override + .disableCrits() + .battleType("single") + .ability(Abilities.SERENE_GRACE) + .moveset([ Moves.AIR_SLASH ]) + .enemySpecies(Species.ALOLA_GEODUDE) + .enemyLevel(10) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([ Moves.SPLASH ]); }); - it("Move chance without Serene Grace", async () => { - const moveToUse = Moves.AIR_SLASH; - await game.startBattle([ - Species.PIDGEOT - ]); + it("Serene Grace should double the secondary effect chance of a move", async () => { + await game.classicMode.startBattle([ Species.SHUCKLE ]); + const airSlashMove = allMoves[Moves.AIR_SLASH]; + const airSlashFlinchAttr = airSlashMove.getAttrs(FlinchAttr)[0]; + vi.spyOn(airSlashFlinchAttr, "getMoveChance"); - game.scene.getEnemyParty()[0].stats[Stat.SPDEF] = 10000; - expect(game.scene.getPlayerParty()[0].formIndex).toBe(0); - - game.move.select(moveToUse); - + game.move.select(Moves.AIR_SLASH); await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase, false); + await game.move.forceHit(); + await game.phaseInterceptor.to("BerryPhase"); - // Check chance of Air Slash without Serene Grace - const phase = game.scene.getCurrentPhase() as MoveEffectPhase; - const move = phase.move.getMove(); - expect(move.id).toBe(Moves.AIR_SLASH); - - const chance = new Utils.IntegerHolder(move.chance); - console.log(move.chance + " Their ability is " + phase.getUserPokemon()!.getAbility().name); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getFirstTarget(), false); - expect(chance.value).toBe(30); - - }, 20000); - - it("Move chance with Serene Grace", async () => { - const moveToUse = Moves.AIR_SLASH; - game.override.ability(Abilities.SERENE_GRACE); - await game.startBattle([ - Species.TOGEKISS - ]); - - game.scene.getEnemyParty()[0].stats[Stat.SPDEF] = 10000; - expect(game.scene.getPlayerParty()[0].formIndex).toBe(0); - - game.move.select(moveToUse); - - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase, false); - - // Check chance of Air Slash with Serene Grace - const phase = game.scene.getCurrentPhase() as MoveEffectPhase; - const move = phase.move.getMove(); - expect(move.id).toBe(Moves.AIR_SLASH); - - const chance = new Utils.IntegerHolder(move.chance); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getFirstTarget(), false); - expect(chance.value).toBe(60); - - }, 20000); - - //TODO King's Rock Interaction Unit Test + expect(airSlashFlinchAttr.getMoveChance).toHaveLastReturnedWith(60); + }); }); diff --git a/src/test/abilities/sheer_force.test.ts b/src/test/abilities/sheer_force.test.ts index 826694752b7..a0ddf5bb9c6 100644 --- a/src/test/abilities/sheer_force.test.ts +++ b/src/test/abilities/sheer_force.test.ts @@ -1,15 +1,13 @@ import { BattlerIndex } from "#app/battle"; -import { applyAbAttrs, applyPostDefendAbAttrs, applyPreAttackAbAttrs, MoveEffectChanceMultiplierAbAttr, MovePowerBoostAbAttr, PostDefendTypeChangeAbAttr } from "#app/data/ability"; -import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import { NumberHolder } from "#app/utils"; +import { Type } from "#app/enums/type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { allMoves } from "#app/data/move"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { allMoves, FlinchAttr } from "#app/data/move"; describe("Abilities - Sheer Force", () => { let phaserGame: Phaser.Game; @@ -27,143 +25,91 @@ describe("Abilities - Sheer Force", () => { beforeEach(() => { game = new GameManager(phaserGame); - const movesToUse = [ Moves.AIR_SLASH, Moves.BIND, Moves.CRUSH_CLAW, Moves.TACKLE ]; - game.override.battleType("single"); - game.override.enemySpecies(Species.ONIX); - game.override.startingLevel(100); - game.override.moveset(movesToUse); - game.override.enemyMoveset([ Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE ]); + game.override + .battleType("single") + .ability(Abilities.SHEER_FORCE) + .enemySpecies(Species.ONIX) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([ Moves.SPLASH ]) + .disableCrits(); }); - it("Sheer Force", async () => { - const moveToUse = Moves.AIR_SLASH; - game.override.ability(Abilities.SHEER_FORCE); + const SHEER_FORCE_MULT = 5461 / 4096; + + it("Sheer Force should boost the power of the move but disable secondary effects", async () => { + game.override.moveset([ Moves.AIR_SLASH ]); + await game.classicMode.startBattle([ Species.SHUCKLE ]); + + const airSlashMove = allMoves[Moves.AIR_SLASH]; + vi.spyOn(airSlashMove, "calculateBattlePower"); + const airSlashFlinchAttr = airSlashMove.getAttrs(FlinchAttr)[0]; + vi.spyOn(airSlashFlinchAttr, "getMoveChance"); + + game.move.select(Moves.AIR_SLASH); + + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.move.forceHit(); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(airSlashMove.calculateBattlePower).toHaveLastReturnedWith(airSlashMove.power * SHEER_FORCE_MULT); + expect(airSlashFlinchAttr.getMoveChance).toHaveLastReturnedWith(0); + }); + + it("Sheer Force does not affect the base damage or secondary effects of binding moves", async () => { + game.override.moveset([ Moves.BIND ]); + await game.classicMode.startBattle([ Species.SHUCKLE ]); + + const bindMove = allMoves[Moves.BIND]; + vi.spyOn(bindMove, "calculateBattlePower"); + + game.move.select(Moves.BIND); + + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.move.forceHit(); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(bindMove.calculateBattlePower).toHaveLastReturnedWith(bindMove.power); + }, 20000); + + it("Sheer Force does not boost the base damage of moves with no secondary effect", async () => { + game.override.moveset([ Moves.TACKLE ]); await game.classicMode.startBattle([ Species.PIDGEOT ]); - game.scene.getEnemyPokemon()!.stats[Stat.SPDEF] = 10000; - expect(game.scene.getPlayerPokemon()!.formIndex).toBe(0); - - game.move.select(moveToUse); + const tackleMove = allMoves[Moves.TACKLE]; + vi.spyOn(tackleMove, "calculateBattlePower"); + game.move.select(Moves.TACKLE); await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase, false); + await game.move.forceHit(); + await game.phaseInterceptor.to("BerryPhase", false); - const phase = game.scene.getCurrentPhase() as MoveEffectPhase; - const move = phase.move.getMove(); - expect(move.id).toBe(Moves.AIR_SLASH); + expect(tackleMove.calculateBattlePower).toHaveLastReturnedWith(tackleMove.power); + }); - //Verify the move is boosted and has no chance of secondary effects - const power = new NumberHolder(move.power); - const chance = new NumberHolder(move.chance); + it("Sheer Force can disable the on-hit activation of specific abilities", async () => { + game.override + .moveset([ Moves.HEADBUTT ]) + .enemySpecies(Species.SQUIRTLE) + .enemyLevel(10) + .enemyAbility(Abilities.COLOR_CHANGE); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getFirstTarget(), false); - applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon()!, phase.getFirstTarget()!, move, false, power); - - expect(chance.value).toBe(0); - expect(power.value).toBe(move.power * 5461 / 4096); - - - }, 20000); - - it("Sheer Force with exceptions including binding moves", async () => { - const moveToUse = Moves.BIND; - game.override.ability(Abilities.SHEER_FORCE); await game.classicMode.startBattle([ Species.PIDGEOT ]); + const enemyPokemon = game.scene.getEnemyPokemon(); + const headbuttMove = allMoves[Moves.HEADBUTT]; + vi.spyOn(headbuttMove, "calculateBattlePower"); + const headbuttFlinchAttr = headbuttMove.getAttrs(FlinchAttr)[0]; + vi.spyOn(headbuttFlinchAttr, "getMoveChance"); - - game.scene.getEnemyPokemon()!.stats[Stat.DEF] = 10000; - expect(game.scene.getPlayerPokemon()!.formIndex).toBe(0); - - game.move.select(moveToUse); + game.move.select(Moves.HEADBUTT); await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase, false); + await game.move.forceHit(); + await game.phaseInterceptor.to("BerryPhase", false); - const phase = game.scene.getCurrentPhase() as MoveEffectPhase; - const move = phase.move.getMove(); - expect(move.id).toBe(Moves.BIND); - - //Binding moves and other exceptions are not affected by Sheer Force and have a chance.value of -1 - const power = new NumberHolder(move.power); - const chance = new NumberHolder(move.chance); - - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getFirstTarget(), false); - applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon()!, phase.getFirstTarget()!, move, false, power); - - expect(chance.value).toBe(-1); - expect(power.value).toBe(move.power); - - - }, 20000); - - it("Sheer Force with moves with no secondary effect", async () => { - const moveToUse = Moves.TACKLE; - game.override.ability(Abilities.SHEER_FORCE); - await game.classicMode.startBattle([ Species.PIDGEOT ]); - - - game.scene.getEnemyPokemon()!.stats[Stat.DEF] = 10000; - expect(game.scene.getPlayerPokemon()!.formIndex).toBe(0); - - game.move.select(moveToUse); - - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase, false); - - const phase = game.scene.getCurrentPhase() as MoveEffectPhase; - const move = phase.move.getMove(); - expect(move.id).toBe(Moves.TACKLE); - - //Binding moves and other exceptions are not affected by Sheer Force and have a chance.value of -1 - const power = new NumberHolder(move.power); - const chance = new NumberHolder(move.chance); - - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getFirstTarget(), false); - applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon()!, phase.getFirstTarget()!, move, false, power); - - expect(chance.value).toBe(-1); - expect(power.value).toBe(move.power); - - - }, 20000); - - it("Sheer Force Disabling Specific Abilities", async () => { - const moveToUse = Moves.CRUSH_CLAW; - game.override.enemyAbility(Abilities.COLOR_CHANGE); - game.override.startingHeldItems([{ name: "KINGS_ROCK", count: 1 }]); - game.override.ability(Abilities.SHEER_FORCE); - await game.startBattle([ Species.PIDGEOT ]); - - - game.scene.getEnemyPokemon()!.stats[Stat.DEF] = 10000; - expect(game.scene.getPlayerPokemon()!.formIndex).toBe(0); - - game.move.select(moveToUse); - - await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); - await game.phaseInterceptor.to(MoveEffectPhase, false); - - const phase = game.scene.getCurrentPhase() as MoveEffectPhase; - const move = phase.move.getMove(); - expect(move.id).toBe(Moves.CRUSH_CLAW); - - //Disable color change due to being hit by Sheer Force - const power = new NumberHolder(move.power); - const chance = new NumberHolder(move.chance); - const user = phase.getUserPokemon()!; - const target = phase.getFirstTarget()!; - const opponentType = target.getTypes()[0]; - - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, user, null, false, chance, move, target, false); - applyPreAttackAbAttrs(MovePowerBoostAbAttr, user, target, move, false, power); - applyPostDefendAbAttrs(PostDefendTypeChangeAbAttr, target, user, move, target.apply(user, move)); - - expect(chance.value).toBe(0); - expect(power.value).toBe(move.power * 5461 / 4096); - expect(target.getTypes().length).toBe(2); - expect(target.getTypes()[0]).toBe(opponentType); - - }, 20000); + expect(enemyPokemon?.getTypes()[0]).toBe(Type.WATER); + expect(headbuttMove.calculateBattlePower).toHaveLastReturnedWith(headbuttMove.power * SHEER_FORCE_MULT); + expect(headbuttFlinchAttr.getMoveChance).toHaveLastReturnedWith(0); + }); it("Two Pokemon with abilities disabled by Sheer Force hitting each other should not cause a crash", async () => { const moveToUse = Moves.CRUNCH; @@ -191,5 +137,19 @@ describe("Abilities - Sheer Force", () => { expect(onix.getTypes()).toStrictEqual(expectedTypes); }); - //TODO King's Rock Interaction Unit Test + it("Sheer Force should disable Meloetta's transformation from Relic Song", async () => { + game.override + .ability(Abilities.SHEER_FORCE) + .moveset([ Moves.RELIC_SONG ]) + .enemyMoveset([ Moves.SPLASH ]) + .enemyLevel(100); + await game.classicMode.startBattle([ Species.MELOETTA ]); + + const playerPokemon = game.scene.getPlayerPokemon(); + const formKeyStart = playerPokemon?.getFormKey(); + + game.move.select(Moves.RELIC_SONG); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(formKeyStart).toBe(playerPokemon?.getFormKey()); + }); }); diff --git a/src/test/abilities/speed_boost.test.ts b/src/test/abilities/speed_boost.test.ts index dd2e83aaa88..ff5184eedae 100644 --- a/src/test/abilities/speed_boost.test.ts +++ b/src/test/abilities/speed_boost.test.ts @@ -28,7 +28,9 @@ describe("Abilities - Speed Boost", () => { game.override .battleType("single") - .enemySpecies(Species.DRAGAPULT) + .enemySpecies(Species.SHUCKLE) + .enemyAbility(Abilities.BALL_FETCH) + .enemyLevel(100) .ability(Abilities.SPEED_BOOST) .enemyMoveset(Moves.SPLASH) .moveset([ Moves.SPLASH, Moves.U_TURN ]); @@ -70,21 +72,23 @@ describe("Abilities - Speed Boost", () => { Species.NINJASK ]); - game.move.select(Moves.U_TURN); - game.doSelectPartyPokemon(1); - await game.toNextTurn(); - let playerPokemon = game.scene.getPlayerPokemon()!; - expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); + const [ shuckle, ninjask ] = game.scene.getPlayerParty(); game.move.select(Moves.U_TURN); game.doSelectPartyPokemon(1); await game.toNextTurn(); - playerPokemon = game.scene.getPlayerPokemon()!; - expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); + expect(game.scene.getPlayerPokemon()!).toBe(ninjask); + expect(ninjask.getStatStage(Stat.SPD)).toBe(0); + + game.move.select(Moves.U_TURN); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + expect(game.scene.getPlayerPokemon()!).toBe(shuckle); + expect(shuckle.getStatStage(Stat.SPD)).toBe(0); game.move.select(Moves.SPLASH); await game.toNextTurn(); - expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1); + expect(shuckle.getStatStage(Stat.SPD)).toBe(1); }); it("should not trigger this turn if pokemon was switched into combat via normal switch, but the turn after", diff --git a/src/test/abilities/stakeout.test.ts b/src/test/abilities/stakeout.test.ts new file mode 100644 index 00000000000..885169b284e --- /dev/null +++ b/src/test/abilities/stakeout.test.ts @@ -0,0 +1,85 @@ +import { BattlerIndex } from "#app/battle"; +import { isBetween } from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Stakeout", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH, Moves.SURF ]) + .ability(Abilities.STAKEOUT) + .battleType("single") + .disableCrits() + .startingLevel(100) + .enemyLevel(100) + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([ Moves.SPLASH, Moves.FLIP_TURN ]) + .startingWave(5); + }); + + it("should do double damage to a pokemon that switched out", async () => { + await game.classicMode.startBattle([ Species.MILOTIC ]); + + const [ enemy1, ] = game.scene.getEnemyParty(); + + game.move.select(Moves.SURF); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + const damage1 = enemy1.getInverseHp(); + enemy1.hp = enemy1.getMaxHp(); + + game.move.select(Moves.SPLASH); + game.forceEnemyToSwitch(); + await game.toNextTurn(); + + game.move.select(Moves.SURF); + game.forceEnemyToSwitch(); + await game.toNextTurn(); + + expect(enemy1.isFainted()).toBe(false); + expect(isBetween(enemy1.getInverseHp(), (damage1 * 2) - 5, (damage1 * 2) + 5)).toBe(true); + }); + + it("should do double damage to a pokemon that switched out via U-Turn/etc", async () => { + await game.classicMode.startBattle([ Species.MILOTIC ]); + + const [ enemy1, ] = game.scene.getEnemyParty(); + + game.move.select(Moves.SURF); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + const damage1 = enemy1.getInverseHp(); + enemy1.hp = enemy1.getMaxHp(); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.FLIP_TURN); + await game.toNextTurn(); + + game.move.select(Moves.SURF); + await game.forceEnemyMove(Moves.FLIP_TURN); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextTurn(); + + expect(enemy1.isFainted()).toBe(false); + expect(isBetween(enemy1.getInverseHp(), (damage1 * 2) - 5, (damage1 * 2) + 5)).toBe(true); + }); +}); diff --git a/src/test/abilities/sturdy.test.ts b/src/test/abilities/sturdy.test.ts index 49384e69f83..07ccbbb68e5 100644 --- a/src/test/abilities/sturdy.test.ts +++ b/src/test/abilities/sturdy.test.ts @@ -1,5 +1,5 @@ import { EnemyPokemon } from "#app/field/pokemon"; -import { DamagePhase } from "#app/phases/damage-phase"; +import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -55,7 +55,7 @@ describe("Abilities - Sturdy", () => { enemyPokemon.hp = enemyPokemon.getMaxHp() - 1; game.move.select(Moves.CLOSE_COMBAT); - await game.phaseInterceptor.to(DamagePhase); + await game.phaseInterceptor.to(DamageAnimPhase); expect(enemyPokemon.hp).toBe(0); expect(enemyPokemon.isFainted()).toBe(true); @@ -81,7 +81,7 @@ describe("Abilities - Sturdy", () => { await game.startBattle(); game.move.select(Moves.CLOSE_COMBAT); - await game.phaseInterceptor.to(DamagePhase); + await game.phaseInterceptor.to(DamageAnimPhase); const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; expect(enemyPokemon.hp).toBe(0); diff --git a/src/test/abilities/wimp_out.test.ts b/src/test/abilities/wimp_out.test.ts index 4283386b248..bff68b54c75 100644 --- a/src/test/abilities/wimp_out.test.ts +++ b/src/test/abilities/wimp_out.test.ts @@ -632,4 +632,34 @@ describe("Abilities - Wimp Out", () => { const hasFled = enemyPokemon.switchOutStatus; expect(isVisible && !hasFled).toBe(true); }); + it("wimp out will not skip battles when triggered in a double battle", async () => { + const wave = 2; + game.override + .enemyMoveset(Moves.SPLASH) + .enemySpecies(Species.WIMPOD) + .enemyAbility(Abilities.WIMP_OUT) + .moveset([ Moves.MATCHA_GOTCHA, Moves.FALSE_SWIPE ]) + .startingLevel(50) + .enemyLevel(1) + .battleType("double") + .startingWave(wave); + await game.classicMode.startBattle([ + Species.RAICHU, + Species.PIKACHU + ]); + const [ wimpod0, wimpod1 ] = game.scene.getEnemyField(); + + game.move.select(Moves.FALSE_SWIPE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.MATCHA_GOTCHA, 1); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(wimpod0.hp).toBeGreaterThan(0); + expect(wimpod0.switchOutStatus).toBe(true); + expect(wimpod0.isFainted()).toBe(false); + expect(wimpod1.isFainted()).toBe(true); + + await game.toNextWave(); + expect(game.scene.currentBattle.waveIndex).toBe(wave + 1); + }); }); diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts index 656cc62ac59..d2b074acce0 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -3,7 +3,7 @@ import { Stat } from "#enums/stat"; import { GameModes, getGameMode } from "#app/game-mode"; import { BattleEndPhase } from "#app/phases/battle-end-phase"; import { CommandPhase } from "#app/phases/command-phase"; -import { DamagePhase } from "#app/phases/damage-phase"; +import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { EncounterPhase } from "#app/phases/encounter-phase"; import { EnemyCommandPhase } from "#app/phases/enemy-command-phase"; import { LoginPhase } from "#app/phases/login-phase"; @@ -267,7 +267,7 @@ describe("Test Battle Phase", () => { ]); game.move.select(moveToUse); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); await game.killPokemon(game.scene.currentBattle.enemyParty[0]); expect(game.scene.currentBattle.enemyParty[0].isFainted()).toBe(true); await game.phaseInterceptor.to(VictoryPhase, false); diff --git a/src/test/battle/damage_calculation.test.ts b/src/test/battle/damage_calculation.test.ts index e6ecbe4646f..e6aca828156 100644 --- a/src/test/battle/damage_calculation.test.ts +++ b/src/test/battle/damage_calculation.test.ts @@ -102,7 +102,7 @@ describe("Battle Mechanics - Damage Calculation", () => { game.move.select(Moves.JUMP_KICK); - await game.phaseInterceptor.to("DamagePhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); expect(shedinja.hp).toBe(shedinja.getMaxHp() - 1); }); diff --git a/src/test/battlerTags/octolock.test.ts b/src/test/battlerTags/octolock.test.ts index ebd92dc6401..9efce220fe8 100644 --- a/src/test/battlerTags/octolock.test.ts +++ b/src/test/battlerTags/octolock.test.ts @@ -1,9 +1,8 @@ import BattleScene from "#app/battle-scene"; import { describe, expect, it, vi } from "vitest"; import Pokemon from "#app/field/pokemon"; -import { BattlerTag, BattlerTagLapseType, OctolockTag, TrappedTag } from "#app/data/battler-tags"; +import { BattlerTagLapseType, OctolockTag, TrappedTag } from "#app/data/battler-tags"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; -import { BattlerTagType } from "#app/enums/battler-tag-type"; import { Stat } from "#enums/stat"; vi.mock("#app/battle-scene.js"); @@ -33,30 +32,4 @@ describe("BattlerTag - OctolockTag", () => { it ("traps its target (extends TrappedTag)", async () => { expect(new OctolockTag(1)).toBeInstanceOf(TrappedTag); }); - - it("can be added to pokemon who are not octolocked", async => { - const mockPokemon = { - getTag: vi.fn().mockReturnValue(undefined) as Pokemon["getTag"], - } as Pokemon; - - const subject = new OctolockTag(1); - - expect(subject.canAdd(mockPokemon)).toBeTruthy(); - - expect(mockPokemon.getTag).toHaveBeenCalledTimes(1); - expect(mockPokemon.getTag).toHaveBeenCalledWith(BattlerTagType.OCTOLOCK); - }); - - it("cannot be added to pokemon who are octolocked", async => { - const mockPokemon = { - getTag: vi.fn().mockReturnValue(new BattlerTag(null!, null!, null!, null!)) as Pokemon["getTag"], - } as Pokemon; - - const subject = new OctolockTag(1); - - expect(subject.canAdd(mockPokemon)).toBeFalsy(); - - expect(mockPokemon.getTag).toHaveBeenCalledTimes(1); - expect(mockPokemon.getTag).toHaveBeenCalledWith(BattlerTagType.OCTOLOCK); - }); }); diff --git a/src/test/eggs/egg.test.ts b/src/test/eggs/egg.test.ts index aebb196ff5e..1a33b4eff7c 100644 --- a/src/test/eggs/egg.test.ts +++ b/src/test/eggs/egg.test.ts @@ -1,5 +1,4 @@ import { speciesEggTiers } from "#app/data/balance/species-egg-tiers"; -import { speciesStarterCosts } from "#app/data/balance/starters"; import { Egg, getLegendaryGachaSpeciesForTimestamp, getValidLegendaryGachaSpecies } from "#app/data/egg"; import { allSpecies } from "#app/data/pokemon-species"; import { EggSourceType } from "#app/enums/egg-source-types"; @@ -33,28 +32,28 @@ describe("Egg Generation Tests", () => { await game.importData("src/test/utils/saves/everything.prsv"); }); - it("should return Arceus for the 10th of June", () => { + it("should return Kyogre for the 10th of June", () => { const scene = game.scene; const timestamp = new Date(2024, 5, 10, 15, 0, 0, 0).getTime(); - const expectedSpecies = Species.ARCEUS; + const expectedSpecies = Species.KYOGRE; const result = getLegendaryGachaSpeciesForTimestamp(scene, timestamp); expect(result).toBe(expectedSpecies); }); - it("should return Arceus for the 10th of July", () => { + it("should return Kyogre for the 10th of July", () => { const scene = game.scene; const timestamp = new Date(2024, 6, 10, 15, 0, 0, 0).getTime(); - const expectedSpecies = Species.ARCEUS; + const expectedSpecies = Species.KYOGRE; const result = getLegendaryGachaSpeciesForTimestamp(scene, timestamp); expect(result).toBe(expectedSpecies); }); - it("should hatch an Arceus around half the time. Set from legendary gacha", async () => { + it("should hatch a Kyogre around half the time. Set from legendary gacha", async () => { const scene = game.scene; const timestamp = new Date(2024, 6, 10, 15, 0, 0, 0).getTime(); - const expectedSpecies = Species.ARCEUS; + const expectedSpecies = Species.KYOGRE; let gachaSpeciesCount = 0; for (let i = 0; i < EGG_HATCH_COUNT; i++) { @@ -385,23 +384,4 @@ describe("Egg Generation Tests", () => { expect(diffShiny).toBe(true); expect(diffAbility).toBe(true); }); - - // For now, we are using this test to detect oversights in egg tiers. - // Delete this test if the balance team rebalances species costs independently of egg tiers. - it("should have correct egg tiers based on species costs", () => { - const getExpectedEggTier = (starterCost) => - starterCost <= 3 ? EggTier.COMMON - : starterCost <= 5 ? EggTier.RARE - : starterCost <= 7 ? EggTier.EPIC - : EggTier.LEGENDARY; - - allSpecies.forEach(pokemonSpecies => { - const rootSpecies = pokemonSpecies.getRootSpeciesId(); - const speciesCost = speciesStarterCosts[rootSpecies]; - const expectedEggTier = getExpectedEggTier(speciesCost); - const actualEggTier = speciesEggTiers[rootSpecies]; - - expect(actualEggTier).toBe(expectedEggTier); - }); - }); }); diff --git a/src/test/items/leftovers.test.ts b/src/test/items/leftovers.test.ts index cfbf7c2f734..672151d97cb 100644 --- a/src/test/items/leftovers.test.ts +++ b/src/test/items/leftovers.test.ts @@ -1,4 +1,4 @@ -import { DamagePhase } from "#app/phases/damage-phase"; +import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -48,7 +48,7 @@ describe("Items - Leftovers", () => { game.move.select(Moves.SPLASH); // We should have less hp after the attack - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); const leadHpAfterDamage = leadPokemon.hp; diff --git a/src/test/items/multi_lens.test.ts b/src/test/items/multi_lens.test.ts index c5e60c9f9e5..bd586878fce 100644 --- a/src/test/items/multi_lens.test.ts +++ b/src/test/items/multi_lens.test.ts @@ -24,7 +24,7 @@ describe("Items - Multi Lens", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.TACKLE, Moves.TRAILBLAZE, Moves.TACHYON_CUTTER ]) + .moveset([ Moves.TACKLE, Moves.TRAILBLAZE, Moves.TACHYON_CUTTER, Moves.FUTURE_SIGHT ]) .ability(Abilities.BALL_FETCH) .startingHeldItems([{ name: "MULTI_LENS" }]) .battleType("single") @@ -135,4 +135,78 @@ describe("Items - Multi Lens", () => { expect(damageResults[0]).toBe(Math.floor(playerPokemon.level * 0.75)); expect(damageResults[1]).toBe(Math.floor(playerPokemon.level * 0.25)); }); + + it("should result in correct damage for hp% attacks with 1 lens", async () => { + game.override.startingHeldItems([{ name: "MULTI_LENS", count: 1 }]) + .moveset(Moves.SUPER_FANG) + .ability(Abilities.COMPOUND_EYES) + .enemyLevel(1000) + .enemySpecies(Species.BLISSEY); // allows for unrealistically high levels of accuracy + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SUPER_FANG); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("MoveEndPhase"); + expect(enemyPokemon.getHpRatio()).toBeCloseTo(0.5, 5); + }); + + it("should result in correct damage for hp% attacks with 2 lenses", async () => { + game.override.startingHeldItems([{ name: "MULTI_LENS", count: 2 }]) + .moveset(Moves.SUPER_FANG) + .ability(Abilities.COMPOUND_EYES) + .enemyMoveset(Moves.SPLASH) + .enemyLevel(1000) + .enemySpecies(Species.BLISSEY); // allows for unrealistically high levels of accuracy + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SUPER_FANG); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("MoveEndPhase"); + expect(enemyPokemon.getHpRatio()).toBeCloseTo(0.5, 5); + }); + + it("should result in correct damage for hp% attacks with 2 lenses + Parental Bond", async () => { + game.override.startingHeldItems([{ name: "MULTI_LENS", count: 2 }]) + .moveset(Moves.SUPER_FANG) + .ability(Abilities.PARENTAL_BOND) + .passiveAbility(Abilities.COMPOUND_EYES) + .enemyMoveset(Moves.SPLASH) + .enemyLevel(1000) + .enemySpecies(Species.BLISSEY); // allows for unrealistically high levels of accuracy + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SUPER_FANG); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("MoveEndPhase"); + expect(enemyPokemon.getHpRatio()).toBeCloseTo(0.25, 5); + }); + + it("should not allow Future Sight to hit infinitely many times if the user switches out", async () => { + game.override.enemyLevel(1000); + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "damageAndUpdate"); + + game.move.select(Moves.FUTURE_SIGHT); + await game.toNextTurn(); + + game.doSwitchPokemon(1); + await game.toNextTurn(); + + game.doSwitchPokemon(2); + await game.toNextTurn(); + + // TODO: Update hit count to 1 once Future Sight is fixed to not activate held items if user is off the field + expect(enemyPokemon.damageAndUpdate).toHaveBeenCalledTimes(2); + }); }); diff --git a/src/test/moves/dragon_tail.test.ts b/src/test/moves/dragon_tail.test.ts index 6b3e669f770..96db67279d3 100644 --- a/src/test/moves/dragon_tail.test.ts +++ b/src/test/moves/dragon_tail.test.ts @@ -1,5 +1,9 @@ import { BattlerIndex } from "#app/battle"; import { allMoves } from "#app/data/move"; +import { Status } from "#app/data/status-effect"; +import { Challenges } from "#enums/challenges"; +import { StatusEffect } from "#enums/status-effect"; +import { Type } from "#enums/type"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -193,4 +197,122 @@ describe("Moves - Dragon Tail", () => { expect(dratini.hp).toBe(Math.floor(dratini.getMaxHp() / 2)); expect(game.scene.getPlayerField().length).toBe(1); }); + + it("should force switches randomly", async () => { + game.override.enemyMoveset(Moves.DRAGON_TAIL) + .startingLevel(100) + .enemyLevel(1); + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + const [ bulbasaur, charmander, squirtle ] = game.scene.getPlayerParty(); + + // Turn 1: Mock an RNG call that calls for switching to 1st backup Pokemon (Charmander) + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + return min; + }); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.DRAGON_TAIL); + await game.toNextTurn(); + + expect(bulbasaur.isOnField()).toBe(false); + expect(charmander.isOnField()).toBe(true); + expect(squirtle.isOnField()).toBe(false); + expect(bulbasaur.getInverseHp()).toBeGreaterThan(0); + + // Turn 2: Mock an RNG call that calls for switching to 2nd backup Pokemon (Squirtle) + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + return min + 1; + }); + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(bulbasaur.isOnField()).toBe(false); + expect(charmander.isOnField()).toBe(false); + expect(squirtle.isOnField()).toBe(true); + expect(charmander.getInverseHp()).toBeGreaterThan(0); + }); + + it("should not force a switch to a challenge-ineligible Pokemon", async () => { + game.override.enemyMoveset(Moves.DRAGON_TAIL) + .startingLevel(100) + .enemyLevel(1); + // Mono-Water challenge, Eevee is ineligible + game.challengeMode.addChallenge(Challenges.SINGLE_TYPE, Type.WATER + 1, 0); + await game.challengeMode.startBattle([ Species.LAPRAS, Species.EEVEE, Species.TOXAPEX, Species.PRIMARINA ]); + + const [ lapras, eevee, toxapex, primarina ] = game.scene.getPlayerParty(); + + // Turn 1: Mock an RNG call that would normally call for switching to Eevee, but it is ineligible + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + return min; + }); + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(lapras.isOnField()).toBe(false); + expect(eevee.isOnField()).toBe(false); + expect(toxapex.isOnField()).toBe(true); + expect(primarina.isOnField()).toBe(false); + expect(lapras.getInverseHp()).toBeGreaterThan(0); + }); + + it("should not force a switch to a fainted Pokemon", async () => { + game.override.enemyMoveset([ Moves.SPLASH, Moves.DRAGON_TAIL ]) + .startingLevel(100) + .enemyLevel(1); + await game.classicMode.startBattle([ Species.LAPRAS, Species.EEVEE, Species.TOXAPEX, Species.PRIMARINA ]); + + const [ lapras, eevee, toxapex, primarina ] = game.scene.getPlayerParty(); + + // Turn 1: Eevee faints + eevee.hp = 0; + eevee.status = new Status(StatusEffect.FAINT); + expect(eevee.isFainted()).toBe(true); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + // Turn 2: Mock an RNG call that would normally call for switching to Eevee, but it is fainted + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + return min; + }); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.DRAGON_TAIL); + await game.toNextTurn(); + + expect(lapras.isOnField()).toBe(false); + expect(eevee.isOnField()).toBe(false); + expect(toxapex.isOnField()).toBe(true); + expect(primarina.isOnField()).toBe(false); + expect(lapras.getInverseHp()).toBeGreaterThan(0); + }); + + it("should not force a switch if there are no available Pokemon to switch into", async () => { + game.override.enemyMoveset([ Moves.SPLASH, Moves.DRAGON_TAIL ]) + .startingLevel(100) + .enemyLevel(1); + await game.classicMode.startBattle([ Species.LAPRAS, Species.EEVEE ]); + + const [ lapras, eevee ] = game.scene.getPlayerParty(); + + // Turn 1: Eevee faints + eevee.hp = 0; + eevee.status = new Status(StatusEffect.FAINT); + expect(eevee.isFainted()).toBe(true); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + // Turn 2: Mock an RNG call that would normally call for switching to Eevee, but it is fainted + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + return min; + }); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.DRAGON_TAIL); + await game.toNextTurn(); + + expect(lapras.isOnField()).toBe(true); + expect(eevee.isOnField()).toBe(false); + expect(lapras.getInverseHp()).toBeGreaterThan(0); + }); }); diff --git a/src/test/moves/dynamax_cannon.test.ts b/src/test/moves/dynamax_cannon.test.ts index 001f986bd52..269374f7514 100644 --- a/src/test/moves/dynamax_cannon.test.ts +++ b/src/test/moves/dynamax_cannon.test.ts @@ -1,6 +1,6 @@ import { BattlerIndex } from "#app/battle"; import { allMoves } from "#app/data/move"; -import { DamagePhase } from "#app/phases/damage-phase"; +import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -51,7 +51,7 @@ describe("Moves - Dynamax Cannon", () => { await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(dynamaxCannon.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(100); }, 20000); @@ -65,7 +65,7 @@ describe("Moves - Dynamax Cannon", () => { await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(dynamaxCannon.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(100); }, 20000); @@ -82,7 +82,7 @@ describe("Moves - Dynamax Cannon", () => { expect(phase.move.moveId).toBe(dynamaxCannon.id); // Force level cap to be 100 vi.spyOn(phase.getFirstTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(120); }, 20000); @@ -99,7 +99,7 @@ describe("Moves - Dynamax Cannon", () => { expect(phase.move.moveId).toBe(dynamaxCannon.id); // Force level cap to be 100 vi.spyOn(phase.getFirstTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(140); }, 20000); @@ -116,7 +116,7 @@ describe("Moves - Dynamax Cannon", () => { expect(phase.move.moveId).toBe(dynamaxCannon.id); // Force level cap to be 100 vi.spyOn(phase.getFirstTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(160); }, 20000); @@ -133,7 +133,7 @@ describe("Moves - Dynamax Cannon", () => { expect(phase.move.moveId).toBe(dynamaxCannon.id); // Force level cap to be 100 vi.spyOn(phase.getFirstTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(180); }, 20000); @@ -150,7 +150,7 @@ describe("Moves - Dynamax Cannon", () => { expect(phase.move.moveId).toBe(dynamaxCannon.id); // Force level cap to be 100 vi.spyOn(phase.getFirstTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(200); }, 20000); @@ -165,7 +165,7 @@ describe("Moves - Dynamax Cannon", () => { await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(dynamaxCannon.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(200); }, 20000); }); diff --git a/src/test/moves/effectiveness.test.ts b/src/test/moves/effectiveness.test.ts index 829d4533f9b..5ad258d7990 100644 --- a/src/test/moves/effectiveness.test.ts +++ b/src/test/moves/effectiveness.test.ts @@ -6,7 +6,7 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import * as Messages from "#app/messages"; -import { TerastallizeModifier } from "#app/modifier/modifier"; +import { TerastallizeModifier, overrideHeldItems } from "#app/modifier/modifier"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; @@ -15,15 +15,17 @@ function testMoveEffectiveness(game: GameManager, move: Moves, targetSpecies: Sp expected: number, targetAbility: Abilities = Abilities.BALL_FETCH, teraType?: Type): void { // Suppress getPokemonNameWithAffix because it calls on a null battle spec vi.spyOn(Messages, "getPokemonNameWithAffix").mockReturnValue(""); - game.override.enemyAbility(targetAbility); - - if (teraType !== undefined) { - game.override.enemyHeldItems([{ name:"TERA_SHARD", type: teraType }]); - } + game.override + .enemyAbility(targetAbility) + .enemyHeldItems([{ name:"TERA_SHARD", type: teraType }]); const user = game.scene.addPlayerPokemon(getPokemonSpecies(Species.SNORLAX), 5); const target = game.scene.addEnemyPokemon(getPokemonSpecies(targetSpecies), 5, TrainerSlot.NONE); + if (teraType !== undefined) { + overrideHeldItems(game.scene, target, false); + } + expect(target.getMoveEffectiveness(user, allMoves[move])).toBe(expected); user.destroy(); target.destroy(); diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts index 12f075f1b55..15dabb971cc 100644 --- a/src/test/moves/fissure.test.ts +++ b/src/test/moves/fissure.test.ts @@ -1,7 +1,7 @@ import { Stat } from "#enums/stat"; import { Species } from "#app/enums/species"; import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; -import { DamagePhase } from "#app/phases/damage-phase"; +import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -56,7 +56,7 @@ describe("Moves - Fissure", () => { game.override.enemyAbility(Abilities.FUR_COAT); game.move.select(Moves.FISSURE); - await game.phaseInterceptor.to(DamagePhase, true); + await game.phaseInterceptor.to(DamageAnimPhase, true); expect(enemyPokemon.isFainted()).toBe(true); }); diff --git a/src/test/moves/fusion_flare_bolt.test.ts b/src/test/moves/fusion_flare_bolt.test.ts index 1bcd0514357..dbd4479dff8 100644 --- a/src/test/moves/fusion_flare_bolt.test.ts +++ b/src/test/moves/fusion_flare_bolt.test.ts @@ -1,7 +1,7 @@ import { Stat } from "#enums/stat"; import { BattlerIndex } from "#app/battle"; import { allMoves } from "#app/data/move"; -import { DamagePhase } from "#app/phases/damage-phase"; +import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase"; import { MovePhase } from "#app/phases/move-phase"; @@ -58,12 +58,12 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(100); await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(200); }, 20000); @@ -81,12 +81,12 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(100); await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(200); }, 20000); @@ -104,7 +104,7 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(100); await game.phaseInterceptor.to(MoveEndPhase); @@ -114,7 +114,7 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(200); }, 20000); @@ -133,7 +133,7 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(100); await game.phaseInterceptor.to(MoveEndPhase); @@ -142,7 +142,7 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(100); }, 20000); @@ -160,12 +160,12 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(100); await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(200); }, 20000); @@ -209,22 +209,22 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(100); await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(200); await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(200); await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(200); }, 20000); @@ -268,22 +268,22 @@ describe("Moves - Fusion Flare and Fusion Bolt", () => { await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(100); await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(200); await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionBolt.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(fusionBolt.calculateBattlePower).toHaveLastReturnedWith(200); await game.phaseInterceptor.to(MoveEffectPhase, false); expect((game.scene.getCurrentPhase() as MoveEffectPhase).move.moveId).toBe(fusionFlare.id); - await game.phaseInterceptor.to(DamagePhase, false); + await game.phaseInterceptor.to(DamageAnimPhase, false); expect(fusionFlare.calculateBattlePower).toHaveLastReturnedWith(200); }, 20000); }); diff --git a/src/test/moves/glaive_rush.test.ts b/src/test/moves/glaive_rush.test.ts index b36c3e20c7a..9cfbfdd8727 100644 --- a/src/test/moves/glaive_rush.test.ts +++ b/src/test/moves/glaive_rush.test.ts @@ -41,11 +41,11 @@ describe("Moves - Glaive Rush", () => { enemy.hp = 1000; game.move.select(Moves.SHADOW_SNEAK); - await game.phaseInterceptor.to("DamagePhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); const damageDealt = 1000 - enemy.hp; await game.phaseInterceptor.to("TurnEndPhase"); game.move.select(Moves.SHADOW_SNEAK); - await game.phaseInterceptor.to("DamagePhase"); + await game.phaseInterceptor.to("DamageAnimPhase"); expect(enemy.hp).toBeLessThanOrEqual(1001 - (damageDealt * 3)); }); diff --git a/src/test/moves/instruct.test.ts b/src/test/moves/instruct.test.ts new file mode 100644 index 00000000000..0e227ef6a3f --- /dev/null +++ b/src/test/moves/instruct.test.ts @@ -0,0 +1,315 @@ +import { BattlerIndex } from "#app/battle"; +import type Pokemon from "#app/field/pokemon"; +import { MoveResult } from "#app/field/pokemon"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Instruct", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + function instructSuccess(pokemon: Pokemon, move: Moves): void { + expect(pokemon.getLastXMoves(-1)[0].move).toBe(move); + expect(pokemon.getLastXMoves(-1)[1].move).toBe(pokemon.getLastXMoves()[0].move); + expect(pokemon.getMoveset().find(m => m?.moveId === move)?.ppUsed).toBe(2); + } + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .enemySpecies(Species.SHUCKLE) + .enemyAbility(Abilities.NO_GUARD) + .enemyLevel(100) + .startingLevel(100) + .ability(Abilities.BALL_FETCH) + .moveset([ Moves.INSTRUCT, Moves.SONIC_BOOM, Moves.SPLASH, Moves.TORMENT ]) + .disableCrits(); + }); + + it("should repeat enemy's attack move when moving last", async () => { + await game.classicMode.startBattle([ Species.AMOONGUSS ]); + + const enemy = game.scene.getEnemyPokemon()!; + game.move.changeMoveset(enemy, Moves.SONIC_BOOM); + + game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + await game.forceEnemyMove(Moves.SONIC_BOOM, BattlerIndex.PLAYER); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to("TurnEndPhase", false); + + expect(game.scene.getPlayerPokemon()?.getInverseHp()).toBe(40); + instructSuccess(enemy, Moves.SONIC_BOOM); + }); + + it("should repeat enemy's move through substitute", async () => { + await game.classicMode.startBattle([ Species.AMOONGUSS ]); + + const enemy = game.scene.getEnemyPokemon()!; + game.move.changeMoveset(enemy, [ Moves.SONIC_BOOM, Moves.SUBSTITUTE ]); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SUBSTITUTE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.toNextTurn(); + + game.move.select(Moves.INSTRUCT); + await game.forceEnemyMove(Moves.SONIC_BOOM); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to("TurnEndPhase", false); + + expect(game.scene.getPlayerPokemon()?.getInverseHp()).toBe(40); + instructSuccess(game.scene.getEnemyPokemon()!, Moves.SONIC_BOOM); + }); + + it("should repeat ally's attack on enemy", async () => { + game.override + .battleType("double") + .moveset([]); + await game.classicMode.startBattle([ Species.AMOONGUSS, Species.SHUCKLE ]); + + const [ amoonguss, shuckle ] = game.scene.getPlayerField(); + game.move.changeMoveset(amoonguss, Moves.INSTRUCT); + game.move.changeMoveset(shuckle, Moves.SONIC_BOOM); + + game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2); + game.move.select(Moves.SONIC_BOOM, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY); + await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH); + await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.phaseInterceptor.to("TurnEndPhase", false); + + expect(game.scene.getEnemyField()[0].getInverseHp()).toBe(40); + instructSuccess(shuckle, Moves.SONIC_BOOM); + }); + + // TODO: Enable test case once gigaton hammer (and blood moon) is fixed + it.todo("should repeat enemy's Gigaton Hammer", async () => { + game.override + .enemyLevel(5); + await game.classicMode.startBattle([ Species.AMOONGUSS ]); + + const enemy = game.scene.getEnemyPokemon()!; + game.move.changeMoveset(enemy, Moves.GIGATON_HAMMER); + + game.move.select(Moves.INSTRUCT); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to("TurnEndPhase", false); + + instructSuccess(enemy, Moves.GIGATON_HAMMER); + }); + + it("should respect enemy's status condition", async () => { + game.override + .moveset([ Moves.THUNDER_WAVE, Moves.INSTRUCT ]) + .enemyMoveset([ Moves.SPLASH, Moves.SONIC_BOOM ]); + await game.classicMode.startBattle([ Species.AMOONGUSS ]); + + game.move.select(Moves.THUNDER_WAVE); + await game.forceEnemyMove(Moves.SONIC_BOOM); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextTurn(); + + game.move.select(Moves.INSTRUCT); + await game.forceEnemyMove(Moves.SPLASH); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.move.forceStatusActivation(true); + await game.phaseInterceptor.to("MovePhase"); + await game.move.forceStatusActivation(false); + await game.phaseInterceptor.to("TurnEndPhase", false); + + const moveHistory = game.scene.getEnemyPokemon()!.getMoveHistory(); + expect(moveHistory.length).toBe(3); + expect(moveHistory[0].move).toBe(Moves.SONIC_BOOM); + expect(moveHistory[1].move).toBe(Moves.NONE); + expect(moveHistory[2].move).toBe(Moves.SONIC_BOOM); + }); + + it("should not repeat enemy's out of pp move", async () => { + game.override.enemySpecies(Species.UNOWN); + await game.classicMode.startBattle([ Species.AMOONGUSS ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + game.move.changeMoveset(enemyPokemon, Moves.HIDDEN_POWER); + const moveUsed = enemyPokemon.moveset.find(m => m?.moveId === Moves.HIDDEN_POWER)!; + moveUsed.ppUsed = moveUsed.getMovePp() - 1; + + game.move.select(Moves.INSTRUCT); + await game.forceEnemyMove(Moves.HIDDEN_POWER); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to("TurnEndPhase", false); + + const playerMove = game.scene.getPlayerPokemon()!.getLastXMoves()!; + expect(playerMove[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.getMoveHistory().length).toBe(1); + }); + + it("should fail if no move has yet been used by target", async () => { + game.override.enemyMoveset(Moves.SPLASH); + await game.classicMode.startBattle([ Species.AMOONGUSS ]); + + game.move.select(Moves.INSTRUCT); + await game.forceEnemyMove(Moves.SPLASH); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("TurnEndPhase", false); + + expect(game.scene.getPlayerPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should attempt to call enemy's disabled move, but move use itself should fail", async () => { + game.override + .moveset([ Moves.INSTRUCT, Moves.DISABLE ]) + .battleType("double"); + await game.classicMode.startBattle([ Species.AMOONGUSS, Species.DROWZEE ]); + + const [ enemy1, enemy2 ] = game.scene.getEnemyField(); + game.move.changeMoveset(enemy1, Moves.SONIC_BOOM); + game.move.changeMoveset(enemy2, Moves.SPLASH); + + game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.DISABLE, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY); + await game.forceEnemyMove(Moves.SONIC_BOOM, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2 ]); + await game.phaseInterceptor.to("TurnEndPhase", false); + + expect(game.scene.getPlayerField()[0].getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + const enemyMove = game.scene.getEnemyPokemon()!.getLastXMoves()[0]; + expect(enemyMove.result).toBe(MoveResult.FAIL); + expect(game.scene.getEnemyPokemon()!.getMoveset().find(m => m?.moveId === Moves.SONIC_BOOM)?.ppUsed).toBe(1); + + }); + + it("should not repeat enemy's move through protect", async () => { + await game.classicMode.startBattle([ Species.AMOONGUSS ]); + + const MoveToUse = Moves.PROTECT; + const enemyPokemon = game.scene.getEnemyPokemon()!; + game.move.changeMoveset(enemyPokemon, MoveToUse); + game.move.select(Moves.INSTRUCT); + await game.forceEnemyMove(Moves.PROTECT); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to("TurnEndPhase", false); + + expect(enemyPokemon.getLastXMoves(-1)[0].move).toBe(Moves.PROTECT); + expect(enemyPokemon.getLastXMoves(-1)[1]).toBeUndefined(); // undefined because protect failed + expect(enemyPokemon.getMoveset().find(m => m?.moveId === Moves.PROTECT)?.ppUsed).toBe(1); + }); + + it("should not repeat enemy's charging move", async () => { + game.override + .enemyMoveset([ Moves.SONIC_BOOM, Moves.HYPER_BEAM ]) + .enemyLevel(5); + await game.classicMode.startBattle([ Species.SHUCKLE ]); + + const player = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + enemyPokemon.battleSummonData.moveHistory = [{ move: Moves.SONIC_BOOM, targets: [ BattlerIndex.PLAYER ], result: MoveResult.SUCCESS, virtual: false }]; + + game.move.select(Moves.INSTRUCT); + await game.forceEnemyMove(Moves.HYPER_BEAM); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextTurn(); + + expect(player.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + + game.move.select(Moves.INSTRUCT); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to("TurnEndPhase", false); + + expect(player.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should not repeat dance move not known by target", async () => { + game.override + .battleType("double") + .moveset([ Moves.INSTRUCT, Moves.FIERY_DANCE ]) + .enemyMoveset(Moves.SPLASH) + .enemyAbility(Abilities.DANCER); + await game.classicMode.startBattle([ Species.SHUCKLE, Species.SHUCKLE ]); + + game.move.select(Moves.INSTRUCT, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.select(Moves.FIERY_DANCE, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY); + await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH); + await game.setTurnOrder([ BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.phaseInterceptor.to("TurnEndPhase", false); + + expect(game.scene.getPlayerField()[0].getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should cause multi-hit moves to hit the appropriate number of times in singles", async () => { + game.override + .enemyAbility(Abilities.SKILL_LINK) + .enemyMoveset(Moves.BULLET_SEED); + await game.classicMode.startBattle([ Species.BULBASAUR ]); + + const player = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + game.move.select(Moves.INSTRUCT); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(player.turnData.attacksReceived.length).toBe(10); + + await game.toNextTurn(); + game.move.select(Moves.INSTRUCT); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(player.turnData.attacksReceived.length).toBe(10); + }); + + it("should cause multi-hit moves to hit the appropriate number of times in doubles", async () => { + game.override + .battleType("double") + .enemyAbility(Abilities.SKILL_LINK) + .enemyMoveset([ Moves.BULLET_SEED, Moves.SPLASH ]) + .enemyLevel(5); + await game.classicMode.startBattle([ Species.BULBASAUR, Species.IVYSAUR ]); + + const [ , ivysaur ] = game.scene.getPlayerField(); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.BULLET_SEED, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + game.move.select(Moves.INSTRUCT, 0, BattlerIndex.ENEMY); + game.move.select(Moves.INSTRUCT, 1, BattlerIndex.ENEMY); + await game.forceEnemyMove(Moves.BULLET_SEED, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.SPLASH); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(ivysaur.turnData.attacksReceived.length).toBe(15); + + await game.toNextTurn(); + game.move.select(Moves.INSTRUCT, 0, BattlerIndex.ENEMY); + game.move.select(Moves.INSTRUCT, 1, BattlerIndex.ENEMY); + await game.forceEnemyMove(Moves.BULLET_SEED, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.SPLASH); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2 ]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(ivysaur.turnData.attacksReceived.length).toBe(15); + }); +}); diff --git a/src/test/moves/octolock.test.ts b/src/test/moves/octolock.test.ts index d80b71a51e1..6ca96eeb464 100644 --- a/src/test/moves/octolock.test.ts +++ b/src/test/moves/octolock.test.ts @@ -1,11 +1,8 @@ -import { Stat } from "#enums/stat"; import { TrappedTag } from "#app/data/battler-tags"; -import { CommandPhase } from "#app/phases/command-phase"; -import { MoveEndPhase } from "#app/phases/move-end-phase"; -import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -27,12 +24,13 @@ describe("Moves - Octolock", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single") - .enemySpecies(Species.RATTATA) + game.override + .battleType("single") + .enemySpecies(Species.MAGIKARP) .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) .startingLevel(2000) - .moveset([ Moves.OCTOLOCK, Moves.SPLASH ]) + .moveset([ Moves.OCTOLOCK, Moves.SPLASH, Moves.TRICK_OR_TREAT ]) .ability(Abilities.BALL_FETCH); }); @@ -43,16 +41,15 @@ describe("Moves - Octolock", () => { // use Octolock and advance to init phase of next turn to check for stat changes game.move.select(Moves.OCTOLOCK); - await game.phaseInterceptor.to(TurnInitPhase); + await game.toNextTurn(); expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(-1); expect(enemyPokemon.getStatStage(Stat.SPDEF)).toBe(-1); // take a second turn to make sure stat changes occur again - await game.phaseInterceptor.to(CommandPhase); game.move.select(Moves.SPLASH); + await game.toNextTurn(); - await game.phaseInterceptor.to(TurnInitPhase); expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(-2); expect(enemyPokemon.getStatStage(Stat.SPDEF)).toBe(-2); }); @@ -65,7 +62,7 @@ describe("Moves - Octolock", () => { // use Octolock and advance to init phase of next turn to check for stat changes game.move.select(Moves.OCTOLOCK); - await game.phaseInterceptor.to(TurnInitPhase); + await game.toNextTurn(); expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(0); expect(enemyPokemon.getStatStage(Stat.SPDEF)).toBe(-1); @@ -79,7 +76,7 @@ describe("Moves - Octolock", () => { // use Octolock and advance to init phase of next turn to check for stat changes game.move.select(Moves.OCTOLOCK); - await game.phaseInterceptor.to(TurnInitPhase); + await game.toNextTurn(); expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(0); expect(enemyPokemon.getStatStage(Stat.SPDEF)).toBe(0); @@ -93,7 +90,7 @@ describe("Moves - Octolock", () => { // use Octolock and advance to init phase of next turn to check for stat changes game.move.select(Moves.OCTOLOCK); - await game.phaseInterceptor.to(TurnInitPhase); + await game.toNextTurn(); expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(0); expect(enemyPokemon.getStatStage(Stat.SPDEF)).toBe(0); @@ -110,7 +107,44 @@ describe("Moves - Octolock", () => { game.move.select(Moves.OCTOLOCK); // after Octolock - enemy should be trapped - await game.phaseInterceptor.to(MoveEndPhase); + await game.phaseInterceptor.to("MoveEndPhase"); expect(enemyPokemon.findTag(t => t instanceof TrappedTag)).toBeDefined(); }); + + it("does not work on ghost type pokemon", async () => { + game.override.enemyMoveset(Moves.OCTOLOCK); + await game.classicMode.startBattle([ Species.GASTLY ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + // before Octolock - player should not be trapped + expect(playerPokemon.findTag(t => t instanceof TrappedTag)).toBeUndefined(); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + // after Octolock - player should still not be trapped, and no stat loss + expect(playerPokemon.findTag(t => t instanceof TrappedTag)).toBeUndefined(); + expect(playerPokemon.getStatStage(Stat.DEF)).toBe(0); + expect(playerPokemon.getStatStage(Stat.SPDEF)).toBe(0); + }); + + it("does not work on pokemon with added ghost type via Trick-or-Treat", async () => { + await game.classicMode.startBattle([ Species.FEEBAS ]); + + const enemy = game.scene.getEnemyPokemon()!; + + // before Octolock - pokemon should not be trapped + expect(enemy.findTag(t => t instanceof TrappedTag)).toBeUndefined(); + + game.move.select(Moves.TRICK_OR_TREAT); + await game.toNextTurn(); + game.move.select(Moves.OCTOLOCK); + await game.toNextTurn(); + + // after Octolock - pokemon should still not be trapped, and no stat loss + expect(enemy.findTag(t => t instanceof TrappedTag)).toBeUndefined(); + expect(enemy.getStatStage(Stat.DEF)).toBe(0); + expect(enemy.getStatStage(Stat.SPDEF)).toBe(0); + }); }); diff --git a/src/test/moves/powder.test.ts b/src/test/moves/powder.test.ts new file mode 100644 index 00000000000..a1db2bced3a --- /dev/null +++ b/src/test/moves/powder.test.ts @@ -0,0 +1,318 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#test/utils/gameManager"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { BerryPhase } from "#app/phases/berry-phase"; +import { MoveResult, PokemonMove } from "#app/field/pokemon"; +import { Type } from "#enums/type"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import { StatusEffect } from "#enums/status-effect"; +import { BattlerIndex } from "#app/battle"; + +describe("Moves - Powder", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.battleType("single"); + + game.override + .enemySpecies(Species.SNORLAX) + .enemyLevel(100) + .enemyMoveset(Moves.EMBER) + .enemyAbility(Abilities.INSOMNIA) + .startingLevel(100) + .moveset([ Moves.POWDER, Moves.SPLASH, Moves.FIERY_DANCE, Moves.ROAR ]); + }); + + it( + "should cancel the target's Fire-type move, damage the target, and still consume the target's PP", + async () => { + // Cannot use enemy moveset override for this test, since it interferes with checking PP + game.override.enemyMoveset([]); + await game.classicMode.startBattle([ Species.CHARIZARD ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + enemyPokemon.moveset = [ new PokemonMove(Moves.EMBER) ]; + + game.move.select(Moves.POWDER); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(Math.ceil(3 * enemyPokemon.getMaxHp() / 4)); + expect(enemyPokemon.moveset[0]!.ppUsed).toBe(1); + + await game.toNextTurn(); + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(enemyPokemon.hp).toBe(Math.ceil(3 * enemyPokemon.getMaxHp() / 4)); + expect(enemyPokemon.moveset[0]!.ppUsed).toBe(2); + }); + + it( + "should have no effect against Grass-type Pokemon", + async () => { + game.override.enemySpecies(Species.AMOONGUSS); + + await game.classicMode.startBattle([ Species.CHARIZARD ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.POWDER); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); + + it( + "should have no effect against Pokemon with Overcoat", + async () => { + game.override.enemyAbility(Abilities.OVERCOAT); + + await game.classicMode.startBattle([ Species.CHARIZARD ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.POWDER); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); + + it( + "should not damage the target if the target has Magic Guard", + async () => { + game.override.enemyAbility(Abilities.MAGIC_GUARD); + + await game.classicMode.startBattle([ Species.CHARIZARD ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.POWDER); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); + + it( + "should not damage the target if Primordial Sea is active", + async () => { + game.override.enemyAbility(Abilities.PRIMORDIAL_SEA); + + await game.classicMode.startBattle([ Species.CHARIZARD ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.POWDER); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); + + it( + "should not prevent the target from thawing out with Flame Wheel", + async () => { + game.override + .enemyMoveset(Array(4).fill(Moves.FLAME_WHEEL)) + .enemyStatusEffect(StatusEffect.FREEZE); + + await game.classicMode.startBattle([ Species.CHARIZARD ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.POWDER); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.status?.effect).not.toBe(StatusEffect.FREEZE); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(Math.ceil(3 * enemyPokemon.getMaxHp() / 4)); + } + ); + + it( + "should not allow a target with Protean to change to Fire type", + async () => { + game.override.enemyAbility(Abilities.PROTEAN); + + await game.classicMode.startBattle([ Species.CHARIZARD ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.POWDER); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(enemyPokemon.summonData?.types).not.toBe(Type.FIRE); + }); + + it( + "should cancel Fire-type moves generated by the target's Dancer ability", + async () => { + game.override + .battleType("double") + .enemySpecies(Species.BLASTOISE) + .enemyAbility(Abilities.DANCER); + + await game.classicMode.startBattle([ Species.CHARIZARD, Species.CHARIZARD ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + // Turn 1: Roar away 1 opponent + game.move.select(Moves.ROAR, 0, BattlerIndex.ENEMY_2); + game.move.select(Moves.SPLASH, 1); + await game.toNextTurn(); + await game.toNextTurn(); // Requires game.toNextTurn() twice due to double battle + + // Turn 2: Enemy should activate Powder twice: From using Ember, and from copying Fiery Dance via Dancer + playerPokemon.hp = playerPokemon.getMaxHp(); + game.move.select(Moves.FIERY_DANCE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.POWDER, 1, BattlerIndex.ENEMY); + + await game.phaseInterceptor.to(MoveEffectPhase); + const enemyStartingHp = enemyPokemon.hp; + + await game.phaseInterceptor.to(BerryPhase, false); + + + // player should not take damage + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); + // enemy should have taken damage from player's Fiery Dance + 2 Powder procs + expect(enemyPokemon.hp).toBe(enemyStartingHp - playerPokemon.turnData.totalDamageDealt - 2 * Math.floor(enemyPokemon.getMaxHp() / 4)); + }); + + it( + "should cancel Fiery Dance, then prevent it from triggering Dancer", + async () => { + game.override.ability(Abilities.DANCER) + .enemyMoveset(Moves.FIERY_DANCE); + + await game.classicMode.startBattle([ Species.CHARIZARD ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.POWDER); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(Math.ceil(3 * enemyPokemon.getMaxHp() / 4)); + expect(playerPokemon.getLastXMoves()[0].move).toBe(Moves.POWDER); + }); + + it( + "should cancel Revelation Dance if it becomes a Fire-type move", + async () => { + game.override + .enemySpecies(Species.CHARIZARD) + .enemyMoveset(Array(4).fill(Moves.REVELATION_DANCE)); + + await game.classicMode.startBattle([ Species.CHARIZARD ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.POWDER); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(Math.ceil(3 * enemyPokemon.getMaxHp() / 4)); + }); + + it( + "should cancel Shell Trap and damage the target, even if the move would fail", + async () => { + game.override.enemyMoveset(Array(4).fill(Moves.SHELL_TRAP)); + + await game.classicMode.startBattle([ Species.CHARIZARD ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.POWDER); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(Math.ceil(3 * enemyPokemon.getMaxHp() / 4)); + }); + + it( + "should cancel Grass Pledge if used after ally's Fire Pledge", + async () => { + game.override.enemyMoveset([ Moves.FIRE_PLEDGE, Moves.GRASS_PLEDGE ]) + .battleType("double"); + + await game.classicMode.startBattle([ Species.CHARIZARD, Species.CHARIZARD ]); + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.POWDER, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.GRASS_PLEDGE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.FIRE_PLEDGE, BattlerIndex.PLAYER); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2, BattlerIndex.ENEMY ]); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(Math.ceil(3 * enemyPokemon.getMaxHp() / 4)); + }); + + it( + "should cancel Fire Pledge if used before ally's Water Pledge", + async () => { + game.override.enemyMoveset([ Moves.FIRE_PLEDGE, Moves.WATER_PLEDGE ]) + .battleType("double"); + + await game.classicMode.startBattle([ Species.CHARIZARD, Species.CHARIZARD ]); + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.POWDER, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.FIRE_PLEDGE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.WATER_PLEDGE, BattlerIndex.PLAYER); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2 ]); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(Math.ceil(3 * enemyPokemon.getMaxHp() / 4)); + }); + + it( + "should NOT cancel Fire Pledge if used after ally's Water Pledge", + async () => { + game.override.enemyMoveset([ Moves.FIRE_PLEDGE, Moves.WATER_PLEDGE ]) + .battleType("double"); + + await game.classicMode.startBattle([ Species.CHARIZARD, Species.CHARIZARD ]); + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.POWDER, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.FIRE_PLEDGE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.WATER_PLEDGE, BattlerIndex.PLAYER); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2, BattlerIndex.ENEMY ]); + + await game.phaseInterceptor.to(BerryPhase, false); + expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + }); +}); diff --git a/src/test/moves/scale_shot.test.ts b/src/test/moves/scale_shot.test.ts index e4d768fa13a..cbaa6611f3e 100644 --- a/src/test/moves/scale_shot.test.ts +++ b/src/test/moves/scale_shot.test.ts @@ -1,6 +1,6 @@ import { BattlerIndex } from "#app/battle"; import { allMoves } from "#app/data/move"; -import { DamagePhase } from "#app/phases/damage-phase"; +import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { MoveEndPhase } from "#app/phases/move-end-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; @@ -48,7 +48,7 @@ describe("Moves - Scale Shot", () => { await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); await game.phaseInterceptor.to(MoveEffectPhase); - await game.phaseInterceptor.to(DamagePhase); + await game.phaseInterceptor.to(DamageAnimPhase); //check that stats haven't changed after one or two hits have occurred await game.phaseInterceptor.to(MoveEffectPhase); diff --git a/src/test/moves/shell_side_arm.test.ts b/src/test/moves/shell_side_arm.test.ts index 9646d27f17e..41cbefb186b 100644 --- a/src/test/moves/shell_side_arm.test.ts +++ b/src/test/moves/shell_side_arm.test.ts @@ -26,7 +26,7 @@ describe("Moves - Shell Side Arm", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.SHELL_SIDE_ARM ]) + .moveset([ Moves.SHELL_SIDE_ARM, Moves.SPLASH ]) .battleType("single") .startingLevel(100) .enemyLevel(100) @@ -69,6 +69,9 @@ describe("Moves - Shell Side Arm", () => { vi.spyOn(shellSideArmAttr, "apply"); + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + game.move.select(Moves.SHELL_SIDE_ARM); await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); await game.phaseInterceptor.to("BerryPhase", false); diff --git a/src/test/moves/whirlwind.test.ts b/src/test/moves/whirlwind.test.ts index c16f38111f2..69232bee43a 100644 --- a/src/test/moves/whirlwind.test.ts +++ b/src/test/moves/whirlwind.test.ts @@ -1,11 +1,15 @@ -import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Challenges } from "#enums/challenges"; +import { Type } from "#enums/type"; import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { Status } from "#app/data/status-effect"; +import { StatusEffect } from "#enums/status-effect"; describe("Moves - Whirlwind", () => { let phaserGame: Phaser.Game; @@ -25,8 +29,9 @@ describe("Moves - Whirlwind", () => { game = new GameManager(phaserGame); game.override .battleType("single") + .moveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(Moves.WHIRLWIND) + .enemyMoveset([ Moves.SPLASH, Moves.WHIRLWIND ]) .enemySpecies(Species.PIDGEY); }); @@ -41,10 +46,114 @@ describe("Moves - Whirlwind", () => { const staraptor = game.scene.getPlayerPokemon()!; game.move.select(move); + await game.forceEnemyMove(Moves.WHIRLWIND); await game.phaseInterceptor.to("BerryPhase", false); expect(staraptor.findTag((t) => t.tagType === BattlerTagType.FLYING)).toBeDefined(); expect(game.scene.getEnemyPokemon()!.getLastXMoves(1)[0].result).toBe(MoveResult.MISS); }); + + it("should force switches randomly", async () => { + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + const [ bulbasaur, charmander, squirtle ] = game.scene.getPlayerParty(); + + // Turn 1: Mock an RNG call that calls for switching to 1st backup Pokemon (Charmander) + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + return min; + }); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.WHIRLWIND); + await game.toNextTurn(); + + expect(bulbasaur.isOnField()).toBe(false); + expect(charmander.isOnField()).toBe(true); + expect(squirtle.isOnField()).toBe(false); + + // Turn 2: Mock an RNG call that calls for switching to 2nd backup Pokemon (Squirtle) + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + return min + 1; + }); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.WHIRLWIND); + await game.toNextTurn(); + + expect(bulbasaur.isOnField()).toBe(false); + expect(charmander.isOnField()).toBe(false); + expect(squirtle.isOnField()).toBe(true); + }); + + it("should not force a switch to a challenge-ineligible Pokemon", async () => { + // Mono-Water challenge, Eevee is ineligible + game.challengeMode.addChallenge(Challenges.SINGLE_TYPE, Type.WATER + 1, 0); + await game.challengeMode.startBattle([ Species.LAPRAS, Species.EEVEE, Species.TOXAPEX, Species.PRIMARINA ]); + + const [ lapras, eevee, toxapex, primarina ] = game.scene.getPlayerParty(); + + // Turn 1: Mock an RNG call that would normally call for switching to Eevee, but it is ineligible + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + return min; + }); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.WHIRLWIND); + await game.toNextTurn(); + + expect(lapras.isOnField()).toBe(false); + expect(eevee.isOnField()).toBe(false); + expect(toxapex.isOnField()).toBe(true); + expect(primarina.isOnField()).toBe(false); + }); + + it("should not force a switch to a fainted Pokemon", async () => { + await game.classicMode.startBattle([ Species.LAPRAS, Species.EEVEE, Species.TOXAPEX, Species.PRIMARINA ]); + + const [ lapras, eevee, toxapex, primarina ] = game.scene.getPlayerParty(); + + // Turn 1: Eevee faints + eevee.hp = 0; + eevee.status = new Status(StatusEffect.FAINT); + expect(eevee.isFainted()).toBe(true); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + // Turn 2: Mock an RNG call that would normally call for switching to Eevee, but it is fainted + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + return min; + }); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.WHIRLWIND); + await game.toNextTurn(); + + expect(lapras.isOnField()).toBe(false); + expect(eevee.isOnField()).toBe(false); + expect(toxapex.isOnField()).toBe(true); + expect(primarina.isOnField()).toBe(false); + }); + + it("should not force a switch if there are no available Pokemon to switch into", async () => { + await game.classicMode.startBattle([ Species.LAPRAS, Species.EEVEE ]); + + const [ lapras, eevee ] = game.scene.getPlayerParty(); + + // Turn 1: Eevee faints + eevee.hp = 0; + eevee.status = new Status(StatusEffect.FAINT); + expect(eevee.isFainted()).toBe(true); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + // Turn 2: Mock an RNG call that would normally call for switching to Eevee, but it is fainted + vi.spyOn(game.scene, "randBattleSeedInt").mockImplementation((range, min: number = 0) => { + return min; + }); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.WHIRLWIND); + await game.toNextTurn(); + + expect(lapras.isOnField()).toBe(true); + expect(eevee.isOnField()).toBe(false); + }); }); diff --git a/src/test/mystery-encounter/encounter-test-utils.ts b/src/test/mystery-encounter/encounter-test-utils.ts index cd2fd2db042..ee67f1b5d39 100644 --- a/src/test/mystery-encounter/encounter-test-utils.ts +++ b/src/test/mystery-encounter/encounter-test-utils.ts @@ -33,7 +33,7 @@ export async function runMysteryEncounterToEnd(game: GameManager, optionNo: numb }, () => game.isCurrentPhase(MysteryEncounterBattlePhase) || game.isCurrentPhase(MysteryEncounterRewardsPhase)); if (isBattle) { - game.onNextPrompt("DamagePhase", Mode.MESSAGE, () => { + game.onNextPrompt("DamageAnimPhase", Mode.MESSAGE, () => { game.setMode(Mode.MESSAGE); game.endPhase(); }, () => game.isCurrentPhase(CommandPhase)); diff --git a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts b/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts index a403a306b3d..e7ea6eea0ea 100644 --- a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts @@ -266,6 +266,9 @@ describe("Clowning Around - Mystery Encounter", () => { // 5 Lucky Egg on lead (ultra) itemType = generateModifierType(scene, modifierTypes.LUCKY_EGG) as PokemonHeldItemModifierType; await addItemToPokemon(scene, scene.getPlayerParty()[0], 5, itemType); + // 3 Soothe Bell on lead (great tier, but counted as ultra by this ME) + itemType = generateModifierType(scene, modifierTypes.SOOTHE_BELL) as PokemonHeldItemModifierType; + await addItemToPokemon(scene, scene.getPlayerParty()[0], 3, itemType); // 5 Soul Dew on lead (rogue) itemType = generateModifierType(scene, modifierTypes.SOUL_DEW) as PokemonHeldItemModifierType; await addItemToPokemon(scene, scene.getPlayerParty()[0], 5, itemType); @@ -286,7 +289,7 @@ describe("Clowning Around - Mystery Encounter", () => { const rogueCountAfter = leadItemsAfter .filter(m => m.type.tier === ModifierTier.ROGUE) .reduce((a, b) => a + b.stackCount, 0); - expect(ultraCountAfter).toBe(10); + expect(ultraCountAfter).toBe(13); expect(rogueCountAfter).toBe(7); const secondItemsAfter = scene.getPlayerParty()[1].getHeldItems(); diff --git a/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts b/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts index e8d19ff50b9..2c226df3c8c 100644 --- a/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts @@ -18,6 +18,7 @@ import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { ModifierTier } from "#app/modifier/modifier-tier"; +import * as Utils from "#app/utils"; const namespace = "mysteryEncounters/globalTradeSystem"; const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; @@ -176,6 +177,23 @@ describe("Global Trade System - Mystery Encounter", () => { expect(defaultParty.includes(speciesAfter!)).toBeFalsy(); }); + it("Should roll for shiny twice, with random variant and associated luck", async () => { + // This ensures that the first shiny roll gets ignored, to test the ME rerolling for shiny + game.override.enemyShiny(false); + + await game.runToMysteryEncounter(MysteryEncounterType.GLOBAL_TRADE_SYSTEM, defaultParty); + + vi.spyOn(Utils, "randSeedInt").mockReturnValue(1); // force shiny on reroll + + await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1 }); + + const receivedPokemon = scene.getPlayerParty().at(-1)!; + + expect(receivedPokemon.shiny).toBeTruthy(); + expect(receivedPokemon.variant).toBeDefined(); + expect(receivedPokemon.luck).toBe(receivedPokemon.variant + 1); + }); + it("should leave encounter without battle", async () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); diff --git a/src/test/mystery-encounter/encounters/safari-zone.test.ts b/src/test/mystery-encounter/encounters/safari-zone.test.ts new file mode 100644 index 00000000000..5699afe254f --- /dev/null +++ b/src/test/mystery-encounter/encounters/safari-zone.test.ts @@ -0,0 +1,173 @@ +import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; +import { Biome } from "#enums/biome"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; +import BattleScene from "#app/battle-scene"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; +import { getSafariSpeciesSpawn, SafariZoneEncounter } from "#app/data/mystery-encounters/encounters/safari-zone-encounter"; +import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { NON_LEGEND_PARADOX_POKEMON } from "#app/data/balance/special-species-groups"; + +const namespace = "mysteryEncounters/safariZone"; +const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; +const defaultBiome = Biome.SWAMP; +const defaultWave = 45; + +describe("Safari Zone - Mystery Encounter", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + let scene: BattleScene; + + beforeAll(() => { + phaserGame = new Phaser.Game({ type: Phaser.HEADLESS }); + }); + + beforeEach(async () => { + game = new GameManager(phaserGame); + scene = game.scene; + game.override.mysteryEncounterChance(100); + game.override.startingWave(defaultWave); + game.override.startingBiome(defaultBiome); + game.override.disableTrainerWaves(); + + const biomeMap = new Map([ + [ Biome.VOLCANO, [ MysteryEncounterType.FIGHT_OR_FLIGHT ]], + [ Biome.FOREST, [ MysteryEncounterType.SAFARI_ZONE ]], + [ Biome.SWAMP, [ MysteryEncounterType.SAFARI_ZONE ]], + [ Biome.JUNGLE, [ MysteryEncounterType.SAFARI_ZONE ]], + ]); + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.SAFARI_ZONE, defaultParty); + + expect(SafariZoneEncounter.encounterType).toBe(MysteryEncounterType.SAFARI_ZONE); + expect(SafariZoneEncounter.encounterTier).toBe(MysteryEncounterTier.GREAT); + expect(SafariZoneEncounter.dialogue).toBeDefined(); + expect(SafariZoneEncounter.dialogue.intro).toStrictEqual([ + { text: `${namespace}:intro` }, + ]); + expect(SafariZoneEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); + expect(SafariZoneEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}:description`); + expect(SafariZoneEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}:query`); + expect(SafariZoneEncounter.options.length).toBe(2); + }); + + it("should not spawn outside of the forest, swamp, or jungle biomes", async () => { + game.override.mysteryEncounterTier(MysteryEncounterTier.GREAT); + game.override.startingBiome(Biome.VOLCANO); + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.SAFARI_ZONE); + }); + + it("should initialize fully", async () => { + initSceneWithoutEncounterPhase(scene, defaultParty); + scene.currentBattle.mysteryEncounter = new MysteryEncounter(SafariZoneEncounter); + const encounter = scene.currentBattle.mysteryEncounter!; + scene.currentBattle.waveIndex = defaultWave; + + const { onInit } = encounter; + + expect(encounter.onInit).toBeDefined(); + + encounter.populateDialogueTokensFromRequirements(scene); + const onInitResult = onInit!(scene); + expect(onInitResult).toBe(true); + }); + + describe("Option 1 - Enter", () => { + it("should have the correct properties", () => { + const option = SafariZoneEncounter.options[0]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}:option.1.label`, + buttonTooltip: `${namespace}:option.1.tooltip`, + selected: [ + { + text: `${namespace}:option.1.selected`, + }, + ], + }); + }); + + it("should NOT be selectable if the player doesn't have enough money", async () => { + game.scene.money = 0; + await game.runToMysteryEncounter(MysteryEncounterType.SAFARI_ZONE, defaultParty); + await game.phaseInterceptor.to(MysteryEncounterPhase, false); + + const encounterPhase = scene.getCurrentPhase(); + expect(encounterPhase?.constructor.name).toBe(MysteryEncounterPhase.name); + const mysteryEncounterPhase = encounterPhase as MysteryEncounterPhase; + vi.spyOn(mysteryEncounterPhase, "continueEncounter"); + vi.spyOn(mysteryEncounterPhase, "handleOptionSelect"); + vi.spyOn(scene.ui, "playError"); + + await runSelectMysteryEncounterOption(game, 1); + + expect(scene.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled + expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); + expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); + }); + + it("should not spawn any Paradox Pokemon", async () => { + const NUM_ROLLS = 2000; // As long as this is greater than total number of species, this should cover all possible RNG rolls + let rngSweepProgress = 0; // Will simulate full range of RNG rolls by steadily increasing from 0 to 1 + + vi.spyOn(Phaser.Math.RND, "realInRange").mockImplementation((min: number, max: number) => { + return rngSweepProgress * (max - min) + min; + }); + vi.spyOn(Phaser.Math.RND, "shuffle").mockImplementation((arr: any[]) => arr); + + for (let i = 0; i < NUM_ROLLS; i++) { + rngSweepProgress = (2 * i + 1) / (2 * NUM_ROLLS); + const simSpecies = getSafariSpeciesSpawn().speciesId; + expect(NON_LEGEND_PARADOX_POKEMON).not.toContain(simSpecies); + } + }); + + // TODO: Tests for player actions inside the Safari Zone (Pokeball, Mud, Bait, Flee) + }); + + describe("Option 2 - Leave", () => { + it("should have the correct properties", () => { + const option = SafariZoneEncounter.options[1]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}:option.2.label`, + buttonTooltip: `${namespace}:option.2.tooltip`, + selected: [ + { + text: `${namespace}:option.2.selected`, + }, + ], + }); + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.SAFARI_ZONE, defaultParty); + await runMysteryEncounterToEnd(game, 2); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); +}); diff --git a/src/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts b/src/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts index 7fc2490fcc9..87ccff71e22 100644 --- a/src/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/the-expert-breeder-encounter.test.ts @@ -18,6 +18,7 @@ import { TheExpertPokemonBreederEncounter } from "#app/data/mystery-encounters/e import { TrainerType } from "#enums/trainer-type"; import { EggTier } from "#enums/egg-type"; import { PostMysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; +import { FRIENDSHIP_GAIN_FROM_BATTLE } from "#app/data/balance/starters"; const namespace = "mysteryEncounters/theExpertPokemonBreeder"; const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; @@ -182,7 +183,10 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { await game.phaseInterceptor.to(PostMysteryEncounterPhase); const friendshipAfter = scene.currentBattle.mysteryEncounter!.misc.pokemon1.friendship; - expect(friendshipAfter).toBe(friendshipBefore + 20 + 2); // +2 extra for friendship gained from winning battle + // 20 from ME + extra from winning battle (that extra is not accurate to what happens in game. + // The Pokemon normally gets FRIENDSHIP_GAIN_FROM_BATTLE 3 times, once for each defeated Pokemon + // but due to how skipBattleRunMysteryEncounterRewardsPhase is implemented, it only receives it once) + expect(friendshipAfter).toBe(friendshipBefore + 20 + FRIENDSHIP_GAIN_FROM_BATTLE); }); }); @@ -261,7 +265,7 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { await game.phaseInterceptor.to(PostMysteryEncounterPhase); const friendshipAfter = scene.currentBattle.mysteryEncounter!.misc.pokemon2.friendship; - expect(friendshipAfter).toBe(friendshipBefore + 20 + 2); // +2 extra for friendship gained from winning battle + expect(friendshipAfter).toBe(friendshipBefore + 20 + FRIENDSHIP_GAIN_FROM_BATTLE); // 20 from ME + extra for friendship gained from winning battle }); }); @@ -340,7 +344,7 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => { await game.phaseInterceptor.to(PostMysteryEncounterPhase); const friendshipAfter = scene.currentBattle.mysteryEncounter!.misc.pokemon3.friendship; - expect(friendshipAfter).toBe(friendshipBefore + 20 + 2); // +2 extra for friendship gained from winning battle + expect(friendshipAfter).toBe(friendshipBefore + 20 + FRIENDSHIP_GAIN_FROM_BATTLE); // 20 + extra for friendship gained from winning battle }); }); }); diff --git a/src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts b/src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts index a50c0cf4c9e..e90bc4efe56 100644 --- a/src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts @@ -9,11 +9,12 @@ import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test import BattleScene from "#app/battle-scene"; import { PlayerPokemon } from "#app/field/pokemon"; import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-encounters"; -import { ThePokemonSalesmanEncounter } from "#app/data/mystery-encounters/encounters/the-pokemon-salesman-encounter"; +import { getSalesmanSpeciesOffer, ThePokemonSalesmanEncounter } from "#app/data/mystery-encounters/encounters/the-pokemon-salesman-encounter"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; +import { NON_LEGEND_PARADOX_POKEMON } from "#app/data/balance/special-species-groups"; const namespace = "mysteryEncounters/thePokemonSalesman"; const defaultParty = [ Species.LAPRAS, Species.GENGAR, Species.ABRA ]; @@ -122,7 +123,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { }); }); - it("Should update the player's money properly", async () => { + it("should update the player's money properly", async () => { const initialMoney = 20000; scene.money = initialMoney; const updateMoneySpy = vi.spyOn(EncounterPhaseUtils, "updatePlayerMoney"); @@ -136,7 +137,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { expect(scene.money).toBe(initialMoney - price); }); - it("Should add the Pokemon to the party", async () => { + it("should add the Pokemon to the party", async () => { scene.money = 20000; await game.runToMysteryEncounter(MysteryEncounterType.THE_POKEMON_SALESMAN, defaultParty); @@ -152,6 +153,18 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { expect(newlyPurchasedPokemon!.moveset.length > 0).toBeTruthy(); }); + it("should give the purchased Pokemon its HA or make it shiny", async () => { + scene.money = 20000; + await game.runToMysteryEncounter(MysteryEncounterType.THE_POKEMON_SALESMAN, defaultParty); + await runMysteryEncounterToEnd(game, 1); + + const newlyPurchasedPokemon = scene.getPlayerParty()[scene.getPlayerParty().length - 1]; + const isshiny = newlyPurchasedPokemon.shiny; + const hasHA = newlyPurchasedPokemon.abilityIndex === 2; + expect(isshiny || hasHA).toBeTruthy(); + expect(isshiny && hasHA).toBeFalsy(); + }); + it("should be disabled if player does not have enough money", async () => { scene.money = 0; await game.runToMysteryEncounter(MysteryEncounterType.THE_POKEMON_SALESMAN, defaultParty); @@ -172,6 +185,22 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); }); + it("should not offer any Paradox Pokemon", async () => { + const NUM_ROLLS = 2000; // As long as this is greater than total number of species, this should cover all possible RNG rolls + let rngSweepProgress = 0; // Will simulate full range of RNG rolls by steadily increasing from 0 to 1 + + vi.spyOn(Phaser.Math.RND, "realInRange").mockImplementation((min: number, max: number) => { + return rngSweepProgress * (max - min) + min; + }); + vi.spyOn(Phaser.Math.RND, "shuffle").mockImplementation((arr: any[]) => arr); + + for (let i = 0; i < NUM_ROLLS; i++) { + rngSweepProgress = (2 * i + 1) / (2 * NUM_ROLLS); + const simSpecies = getSalesmanSpeciesOffer().speciesId; + expect(NON_LEGEND_PARADOX_POKEMON).not.toContain(simSpecies); + } + }); + it("should leave encounter without battle", async () => { scene.money = 20000; const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); diff --git a/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts b/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts index ae725f3480a..5c965b13bd4 100644 --- a/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts @@ -109,6 +109,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { species: getPokemonSpecies(Species.SHUCKLE), isBoss: true, bossSegments: 5, + shiny: false, customPokemonData: new CustomPokemonData({ spriteScale: 1.25 }), nature: Nature.BOLD, moveSet: [ Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER ], diff --git a/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts b/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts index 8286c6a694b..f8d96487092 100644 --- a/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts @@ -92,6 +92,7 @@ describe("Trash to Treasure - Mystery Encounter", () => { { species: getPokemonSpecies(Species.GARBODOR), isBoss: true, + shiny: false, formIndex: 1, bossSegmentModifier: 1, moveSet: [ Moves.PAYBACK, Moves.GUNK_SHOT, Moves.STOMPING_TANTRUM, Moves.DRAIN_PUNCH ], diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/src/test/mystery-encounter/mystery-encounter-utils.test.ts index ab2d5f052c0..d17b5c8a587 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/src/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -2,7 +2,7 @@ import BattleScene from "#app/battle-scene"; import { speciesStarterCosts } from "#app/data/balance/starters"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { getEncounterText, queueEncounterMessage, showEncounterDialogue, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { getHighestLevelPlayerPokemon, getLowestLevelPlayerPokemon, getRandomPlayerPokemon, getRandomSpeciesByStarterTier, koPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { getHighestLevelPlayerPokemon, getLowestLevelPlayerPokemon, getRandomPlayerPokemon, getRandomSpeciesByStarterCost, koPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Type } from "#enums/type"; import { MessagePhase } from "#app/phases/message-phase"; @@ -204,9 +204,9 @@ describe("Mystery Encounter Utils", () => { }); }); - describe("getRandomSpeciesByStarterTier", () => { + describe("getRandomSpeciesByStarterCost", () => { it("gets species for a starter tier", () => { - const result = getRandomSpeciesByStarterTier(5); + const result = getRandomSpeciesByStarterCost(5); const pokeSpecies = getPokemonSpecies(result); expect(pokeSpecies.speciesId).toBe(result); @@ -214,7 +214,7 @@ describe("Mystery Encounter Utils", () => { }); it("gets species for a starter tier range", () => { - const result = getRandomSpeciesByStarterTier([ 5, 8 ]); + const result = getRandomSpeciesByStarterCost([ 5, 8 ]); const pokeSpecies = getPokemonSpecies(result); expect(pokeSpecies.speciesId).toBe(result); @@ -224,14 +224,14 @@ describe("Mystery Encounter Utils", () => { it("excludes species from search", () => { // Only 9 tiers are: Koraidon, Miraidon, Arceus, Rayquaza, Kyogre, Groudon, Zacian - const result = getRandomSpeciesByStarterTier(9, [ Species.KORAIDON, Species.MIRAIDON, Species.ARCEUS, Species.RAYQUAZA, Species.KYOGRE, Species.GROUDON ]); + const result = getRandomSpeciesByStarterCost(9, [ Species.KORAIDON, Species.MIRAIDON, Species.ARCEUS, Species.RAYQUAZA, Species.KYOGRE, Species.GROUDON ]); const pokeSpecies = getPokemonSpecies(result); expect(pokeSpecies.speciesId).toBe(Species.ZACIAN); }); it("gets species of specified types", () => { // Only 9 tiers are: Koraidon, Miraidon, Arceus, Rayquaza, Kyogre, Groudon, Zacian - const result = getRandomSpeciesByStarterTier(9, undefined, [ Type.GROUND ]); + const result = getRandomSpeciesByStarterCost(9, undefined, [ Type.GROUND ]); const pokeSpecies = getPokemonSpecies(result); expect(pokeSpecies.speciesId).toBe(Species.GROUDON); }); diff --git a/src/test/utils/helpers/moveHelper.ts b/src/test/utils/helpers/moveHelper.ts index 73fe63395fd..68d3b3d51d7 100644 --- a/src/test/utils/helpers/moveHelper.ts +++ b/src/test/utils/helpers/moveHelper.ts @@ -1,4 +1,6 @@ import { BattlerIndex } from "#app/battle"; +import type Pokemon from "#app/field/pokemon"; +import { PokemonMove } from "#app/field/pokemon"; import Overrides from "#app/overrides"; import { CommandPhase } from "#app/phases/command-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; @@ -71,4 +73,21 @@ export class MoveHelper extends GameManagerHelper { await this.game.phaseInterceptor.to("MovePhase"); vi.spyOn(Overrides, "STATUS_ACTIVATION_OVERRIDE", "get").mockReturnValue(null); } + + /** + * Used when the normal moveset override can't be used (such as when it's necessary to check updated properties of the moveset). + * @param pokemon - The pokemon being modified + * @param moveset - The moveset to use + */ + public changeMoveset(pokemon: Pokemon, moveset: Moves | Moves[]): void { + if (!Array.isArray(moveset)) { + moveset = [ moveset ]; + } + pokemon.moveset = []; + moveset.forEach((move) => { + pokemon.moveset.push(new PokemonMove(move)); + }); + const movesetStr = moveset.map((moveId) => Moves[moveId]).join(", "); + console.log(`Pokemon ${pokemon.species.name}'s moveset manually set to ${movesetStr} (=[${moveset.join(", ")}])!`); + } } diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index 4029e5e168c..13750609004 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -5,7 +5,7 @@ import { BattleEndPhase } from "#app/phases/battle-end-phase"; import { BerryPhase } from "#app/phases/berry-phase"; import { CheckSwitchPhase } from "#app/phases/check-switch-phase"; import { CommandPhase } from "#app/phases/command-phase"; -import { DamagePhase } from "#app/phases/damage-phase"; +import { DamageAnimPhase } from "#app/phases/damage-anim-phase"; import { EggLapsePhase } from "#app/phases/egg-lapse-phase"; import { EncounterPhase } from "#app/phases/encounter-phase"; import { EndEvolutionPhase } from "#app/phases/end-evolution-phase"; @@ -87,7 +87,7 @@ type PhaseClass = | typeof TurnStartPhase | typeof MovePhase | typeof MoveEffectPhase - | typeof DamagePhase + | typeof DamageAnimPhase | typeof FaintPhase | typeof BerryPhase | typeof TurnEndPhase @@ -146,7 +146,7 @@ type PhaseString = | "TurnStartPhase" | "MovePhase" | "MoveEffectPhase" - | "DamagePhase" + | "DamageAnimPhase" | "FaintPhase" | "BerryPhase" | "TurnEndPhase" @@ -229,7 +229,7 @@ export default class PhaseInterceptor { [ TurnStartPhase, this.startPhase ], [ MovePhase, this.startPhase ], [ MoveEffectPhase, this.startPhase ], - [ DamagePhase, this.startPhase ], + [ DamageAnimPhase, this.startPhase ], [ FaintPhase, this.startPhase ], [ BerryPhase, this.startPhase ], [ TurnEndPhase, this.startPhase ], diff --git a/src/ui/login-form-ui-handler.ts b/src/ui/login-form-ui-handler.ts index bba900aef0a..d3c3663ec4b 100644 --- a/src/ui/login-form-ui-handler.ts +++ b/src/ui/login-form-ui-handler.ts @@ -8,6 +8,7 @@ import { addTextObject, TextStyle } from "./text"; import { addWindow } from "./ui-theme"; import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; +import JSZip from "jszip"; interface BuildInteractableImageOpts { scale?: number; @@ -27,6 +28,7 @@ export default class LoginFormUiHandler extends FormModalUiHandler { private googleImage: Phaser.GameObjects.Image; private discordImage: Phaser.GameObjects.Image; private usernameInfoImage: Phaser.GameObjects.Image; + private saveDownloadImage: Phaser.GameObjects.Image; private externalPartyContainer: Phaser.GameObjects.Container; private infoContainer: Phaser.GameObjects.Container; private externalPartyBg: Phaser.GameObjects.NineSlice; @@ -46,7 +48,13 @@ export default class LoginFormUiHandler extends FormModalUiHandler { scale: 0.5 }); + this.saveDownloadImage = this.buildInteractableImage("saving_icon", "save-download-icon", { + x: 0, + scale: 0.75 + }); + this.infoContainer.add(this.usernameInfoImage); + this.infoContainer.add(this.saveDownloadImage); this.getUi().add(this.infoContainer); this.infoContainer.setVisible(false); this.infoContainer.disableInteractive(); @@ -160,7 +168,7 @@ export default class LoginFormUiHandler extends FormModalUiHandler { this.infoContainer.setVisible(false); this.setMouseCursorStyle("default"); //reset cursor - [ this.discordImage, this.googleImage, this.usernameInfoImage ].forEach((img) => img.off("pointerdown")); + [ this.discordImage, this.googleImage, this.usernameInfoImage, this.saveDownloadImage ].forEach((img) => img.off("pointerdown")); } private processExternalProvider(config: ModalConfig): void { @@ -178,6 +186,7 @@ export default class LoginFormUiHandler extends FormModalUiHandler { this.infoContainer.setVisible(true); this.getUi().moveTo(this.infoContainer, this.getUi().length - 1); this.usernameInfoImage.setPositionRelative(this.infoContainer, 0, 0); + this.saveDownloadImage.setPositionRelative(this.infoContainer, 20, 0); this.discordImage.on("pointerdown", () => { const redirectUri = encodeURIComponent(`${import.meta.env.VITE_SERVER_URL}/auth/discord/callback`); @@ -229,6 +238,34 @@ export default class LoginFormUiHandler extends FormModalUiHandler { } }); + this.saveDownloadImage.on("pointerdown", () => { + // find all data_ and sessionData keys, put them in a .txt file and download everything in a single zip + const localStorageKeys = Object.keys(localStorage); // this gets the keys for localStorage + const keyToFind = "data_"; + const sessionKeyToFind = "sessionData"; + const dataKeys = localStorageKeys.filter(ls => ls.indexOf(keyToFind) >= 0); + const sessionKeys = localStorageKeys.filter(ls => ls.indexOf(sessionKeyToFind) >= 0); + if (dataKeys.length > 0 || sessionKeys.length > 0) { + const zip = new JSZip(); + for (let i = 0; i < dataKeys.length; i++) { + zip.file(dataKeys[i] + ".prsv", localStorage.getItem(dataKeys[i])!); + } + for (let i = 0; i < sessionKeys.length; i++) { + zip.file(sessionKeys[i] + ".prsv", localStorage.getItem(sessionKeys[i])!); + } + zip.generateAsync({ type: "blob" }).then(content => { + const url = URL.createObjectURL(content); + const a = document.createElement("a"); + a.href = url; + a.download = "pokerogue_saves.zip"; + a.click(); + URL.revokeObjectURL(url); + }); + } else { + return onFail(this.ERR_NO_SAVES); + } + }); + this.externalPartyContainer.setAlpha(0); this.scene.tweens.add({ targets: this.externalPartyContainer, diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index ead24e6d92f..e0d432265a3 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -313,6 +313,11 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonShinyNewIcon.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, this.scene.uiTheme)); const newShinyOrVariant = ((newShiny & caughtAttr) === BigInt(0)) || ((newVariant & caughtAttr) === BigInt(0)); this.pokemonShinyNewIcon.setVisible(!!newShinyOrVariant); + } else if ((caughtAttr & DexAttr.NON_SHINY) === BigInt(0) && ((caughtAttr & DexAttr.SHINY) === DexAttr.SHINY)) { //If the player has *only* caught any shiny variant of this species, not a non-shiny + this.pokemonShinyNewIcon.setVisible(true); + this.pokemonShinyNewIcon.setText("(+)"); + this.pokemonShinyNewIcon.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); + this.pokemonShinyNewIcon.setShadowColor(getTextColor(TextStyle.SUMMARY_BLUE, true, this.scene.uiTheme)); } else { this.pokemonShinyNewIcon.setVisible(false); } diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts index ace9d956dd9..071690aee54 100644 --- a/src/ui/run-info-ui-handler.ts +++ b/src/ui/run-info-ui-handler.ts @@ -118,6 +118,7 @@ export default class RunInfoUiHandler extends UiHandler { this.runResultContainer = this.scene.add.container(0, 24); const runResultWindow = addWindow(this.scene, 0, 0, this.statsBgWidth - 11, 65); runResultWindow.setOrigin(0, 0); + runResultWindow.setName("Run_Result_Window"); this.runResultContainer.add(runResultWindow); if (this.runDisplayMode === RunDisplayMode.RUN_HISTORY) { this.parseRunResult(); @@ -254,8 +255,6 @@ export default class RunInfoUiHandler extends UiHandler { * Mystery Encounters contain sprites associated with MEs + the title of the specific ME. */ private parseRunStatus() { - const runStatusText = addTextObject(this.scene, 6, 5, `${i18next.t("saveSlotSelectUiHandler:wave")} ${this.runInfo.waveIndex} - ${getBiomeName(this.runInfo.arena.biome)}`, TextStyle.WINDOW, { fontSize : "65px", lineSpacing: 0.1 }); - const enemyContainer = this.scene.add.container(0, 0); this.runResultContainer.add(enemyContainer); if (this.runInfo.battleType === BattleType.WILD) { @@ -271,7 +270,7 @@ export default class RunInfoUiHandler extends UiHandler { const pokeball = this.scene.add.sprite(0, 0, "pb"); pokeball.setFrame(getPokeballAtlasKey(p.pokeball)); pokeball.setScale(0.5); - pokeball.setPosition(52 + ((i % row_limit) * 8), (i <= 2) ? 18 : 25); + pokeball.setPosition(58 + ((i % row_limit) * 8), (i <= 2) ? 18 : 25); enemyContainer.add(pokeball); }); const trainerObj = this.runInfo.trainer.toTrainer(this.scene); @@ -286,7 +285,7 @@ export default class RunInfoUiHandler extends UiHandler { const descContainer = this.scene.add.container(0, 0); const textBox = addTextObject(this.scene, 0, 0, boxString, TextStyle.WINDOW, { fontSize : "35px", wordWrap: { width: 200 }}); descContainer.add(textBox); - descContainer.setPosition(52, 29); + descContainer.setPosition(55, 32); this.runResultContainer.add(descContainer); } else if (this.runInfo.battleType === BattleType.MYSTERY_ENCOUNTER) { const encounterExclaim = this.scene.add.sprite(0, 0, "encounter_exclaim"); @@ -303,7 +302,17 @@ export default class RunInfoUiHandler extends UiHandler { this.runResultContainer.add([ encounterExclaim, subSprite, descContainer ]); } - this.runResultContainer.add(runStatusText); + const runResultWindow = this.runResultContainer.getByName("Run_Result_Window") as Phaser.GameObjects.Image; + const windowCenterX = runResultWindow.getTopCenter().x; + const windowBottomY = runResultWindow.getBottomCenter().y; + + const runStatusText = addTextObject(this.scene, windowCenterX, 5, `${i18next.t("saveSlotSelectUiHandler:wave")} ${this.runInfo.waveIndex}`, TextStyle.WINDOW, { fontSize : "60px", lineSpacing: 0.1 }); + runStatusText.setOrigin(0.5, 0); + + const currentBiomeText = addTextObject(this.scene, windowCenterX, windowBottomY - 5, `${getBiomeName(this.runInfo.arena.biome)}`, TextStyle.WINDOW, { fontSize: "60px" }); + currentBiomeText.setOrigin(0.5, 1); + + this.runResultContainer.add([ runStatusText, currentBiomeText ]); this.runContainer.add(this.runResultContainer); } @@ -387,12 +396,12 @@ export default class RunInfoUiHandler extends UiHandler { tObjSprite.setPosition(-9, -3); tObjPartnerSprite.setScale(0.55); doubleContainer.add([ tObjSprite, tObjPartnerSprite ]); - doubleContainer.setPosition(28, 40); + doubleContainer.setPosition(28, 34); } enemyContainer.add(doubleContainer); } else { - const scale = (this.runDisplayMode === RunDisplayMode.RUN_HISTORY) ? 0.35 : 0.65; - const position = (this.runDisplayMode === RunDisplayMode.RUN_HISTORY) ? [ 12, 28 ] : [ 32, 36 ]; + const scale = (this.runDisplayMode === RunDisplayMode.RUN_HISTORY) ? 0.35 : 0.55; + const position = (this.runDisplayMode === RunDisplayMode.RUN_HISTORY) ? [ 12, 28 ] : [ 30, 32 ]; tObjSprite.setScale(scale, scale); tObjSprite.setPosition(position[0], position[1]); enemyContainer.add(tObjSprite); diff --git a/src/ui/settings/abstract-settings-ui-handler.ts b/src/ui/settings/abstract-settings-ui-handler.ts index 83219e1ef5a..cbc93887810 100644 --- a/src/ui/settings/abstract-settings-ui-handler.ts +++ b/src/ui/settings/abstract-settings-ui-handler.ts @@ -1,8 +1,7 @@ import BattleScene from "#app/battle-scene"; -import { hasTouchscreen, isMobile } from "#app/touch-controls"; import { TextStyle, addTextObject } from "#app/ui/text"; import { Mode } from "#app/ui/ui"; -import UiHandler from "#app/ui/ui-handler"; +import MessageUiHandler from "#app/ui/message-ui-handler"; import { addWindow } from "#app/ui/ui-theme"; import { ScrollBar } from "#app/ui/scroll-bar"; import { Button } from "#enums/buttons"; @@ -15,9 +14,10 @@ import i18next from "i18next"; /** * Abstract class for handling UI elements related to settings. */ -export default class AbstractSettingsUiHandler extends UiHandler { +export default class AbstractSettingsUiHandler extends MessageUiHandler { private settingsContainer: Phaser.GameObjects.Container; private optionsContainer: Phaser.GameObjects.Container; + private messageBoxContainer: Phaser.GameObjects.Container; private navigationContainer: NavigationMenu; private scrollCursor: number; @@ -135,6 +135,23 @@ export default class AbstractSettingsUiHandler extends UiHandler { this.scrollBar = new ScrollBar(this.scene, this.optionsBg.width - 9, this.optionsBg.y + 5, 4, this.optionsBg.height - 11, this.rowsToDisplay); this.scrollBar.setTotalRows(this.settings.length); + // Two-lines message box + this.messageBoxContainer = this.scene.add.container(0, this.scene.scaledCanvas.height); + this.messageBoxContainer.setName("settings-message-box"); + this.messageBoxContainer.setVisible(false); + + const settingsMessageBox = addWindow(this.scene, 0, -1, this.scene.scaledCanvas.width - 2, 48); + settingsMessageBox.setOrigin(0, 1); + this.messageBoxContainer.add(settingsMessageBox); + + const messageText = addTextObject(this.scene, 8, -40, "", TextStyle.WINDOW, { maxLines: 2 }); + messageText.setWordWrapWidth(this.scene.game.canvas.width - 60); + messageText.setName("settings-message"); + messageText.setOrigin(0, 0); + + this.messageBoxContainer.add(messageText); + this.message = messageText; + this.settingsContainer.add(this.optionsBg); this.settingsContainer.add(this.scrollBar); this.settingsContainer.add(this.navigationContainer); @@ -144,6 +161,7 @@ export default class AbstractSettingsUiHandler extends UiHandler { this.settingsContainer.add(iconCancel); this.settingsContainer.add(actionText); this.settingsContainer.add(cancelText); + this.settingsContainer.add(this.messageBoxContainer); ui.add(this.settingsContainer); @@ -326,18 +344,16 @@ export default class AbstractSettingsUiHandler extends UiHandler { /** * Set the option cursor to the specified position. * - * @param settingIndex - The index of the setting. + * @param settingIndex - The index of the setting or -1 to change the current setting * @param cursor - The cursor position to set. * @param save - Whether to save the setting to local storage. * @returns `true` if the option cursor was set successfully. */ setOptionCursor(settingIndex: number, cursor: number, save?: boolean): boolean { - const setting = this.settings[settingIndex]; - - if (setting.key === SettingKeys.Touch_Controls && cursor && hasTouchscreen() && isMobile()) { - this.getUi().playError(); - return false; + if (settingIndex === -1) { + settingIndex = this.cursor + this.scrollCursor; } + const setting = this.settings[settingIndex]; const lastCursor = this.optionCursors[settingIndex]; @@ -352,9 +368,33 @@ export default class AbstractSettingsUiHandler extends UiHandler { newValueLabel.setShadowColor(this.getTextColor(TextStyle.SETTINGS_SELECTED, true)); if (save) { - this.scene.gameData.saveSetting(setting.key, cursor); - if (this.reloadSettings.includes(setting)) { - this.reloadRequired = true; + const saveSetting = () => { + this.scene.gameData.saveSetting(setting.key, cursor); + if (setting.requireReload) { + this.reloadRequired = true; + } + }; + + // For settings that ask for confirmation, display confirmation message and a Yes/No prompt before saving the setting + if (setting.options[cursor].needConfirmation) { + const confirmUpdateSetting = () => { + this.scene.ui.revertMode(); + this.showText(""); + saveSetting(); + }; + const cancelUpdateSetting = () => { + this.scene.ui.revertMode(); + this.showText(""); + // Put the cursor back to its previous position without saving or asking for confirmation again + this.setOptionCursor(settingIndex, lastCursor, false); + }; + + const confirmationMessage = setting.options[cursor].confirmationMessage ?? i18next.t("settings:defaultConfirmMessage"); + this.scene.ui.showText(confirmationMessage, null, () => { + this.scene.ui.setOverlayMode(Mode.CONFIRM, confirmUpdateSetting, cancelUpdateSetting, null, null, 1, 750); + }); + } else { + saveSetting(); } } @@ -421,4 +461,9 @@ export default class AbstractSettingsUiHandler extends UiHandler { } this.cursorObj = null; } + + override showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) { + this.messageBoxContainer.setVisible(!!text?.length); + super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); + } } diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index a08b7ceaec6..691e339eafc 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -39,7 +39,6 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Button } from "#enums/buttons"; import { EggSourceType } from "#enums/egg-source-types"; -import AwaitableUiHandler from "#app/ui/awaitable-ui-handler"; import { DropDown, DropDownLabel, DropDownOption, DropDownState, DropDownType, SortCriteria } from "#app/ui/dropdown"; import { StarterContainer } from "#app/ui/starter-container"; import { DropDownColumn, FilterBar } from "#app/ui/filter-bar"; @@ -51,6 +50,7 @@ import { Abilities } from "#enums/abilities"; import { getPassiveCandyCount, getValueReductionCandyCounts, getSameSpeciesEggCandyCounts } from "#app/data/balance/starters"; import { BooleanHolder, capitalizeString, fixedInt, getLocalizedSpriteKey, isNullOrUndefined, NumberHolder, padInt, randIntRange, rgbHexToRgba, toReadableString } from "#app/utils"; import type { Nature } from "#enums/nature"; +import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; export type StarterSelectCallback = (starters: Starter[]) => void; @@ -1061,15 +1061,21 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } - showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) { + showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer, moveToTop?: boolean) { super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); - if (text?.indexOf("\n") === -1) { - this.starterSelectMessageBox.setSize(318, 28); - this.message.setY(-22); + const singleLine = text?.indexOf("\n") === -1; + + this.starterSelectMessageBox.setSize(318, singleLine ? 28 : 42); + + if (moveToTop) { + this.starterSelectMessageBox.setOrigin(0, 0); + this.starterSelectMessageBoxContainer.setY(0); + this.message.setY(4); } else { - this.starterSelectMessageBox.setSize(318, 42); - this.message.setY(-37); + this.starterSelectMessageBoxContainer.setY(this.scene.game.canvas.height / 6); + this.starterSelectMessageBox.setOrigin(0, 1); + this.message.setY(singleLine ? -22 : -37); } this.starterSelectMessageBoxContainer.setVisible(!!text?.length); @@ -1462,7 +1468,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const currentPartyValue = this.starterSpecies.map(s => s.generation).reduce((total: number, gen: number, i: number) => total += this.scene.gameData.getSpeciesStarterValue(this.starterSpecies[i].speciesId), 0); const newCost = this.scene.gameData.getSpeciesStarterValue(this.lastSpecies.speciesId); - if (!isDupe && isValidForChallenge.value && currentPartyValue + newCost <= this.getValueLimit() && this.starterSpecies.length < 6) { // this checks to make sure the pokemon doesn't exist in your party, it's valid for the challenge and that it won't go over the cost limit; if it meets all these criteria it will add it to your party + if (!isDupe && isValidForChallenge.value && currentPartyValue + newCost <= this.getValueLimit() && this.starterSpecies.length < PLAYER_PARTY_MAX_SIZE) { // this checks to make sure the pokemon doesn't exist in your party, it's valid for the challenge and that it won't go over the cost limit; if it meets all these criteria it will add it to your party options = [ { label: i18next.t("starterSelectUiHandler:addToParty"), @@ -1803,8 +1809,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { options.push({ label: `x${sameSpeciesEggCost} ${i18next.t("starterSelectUiHandler:sameSpeciesEgg")}`, handler: () => { - if ((this.scene.gameData.eggs.length < 99 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) - && (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= sameSpeciesEggCost)) { + if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= sameSpeciesEggCost) { + if (this.scene.gameData.eggs.length >= 99 && !Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { + // Egg list full, show error message at the top of the screen and abort + this.showText(i18next.t("egg:tooManyEggs"), undefined, () => this.showText("", 0, () => this.tutorialActive = false), 2000, false, undefined, true); + return false; + } if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { starterData.candyCount -= sameSpeciesEggCost; } @@ -3564,9 +3574,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { }, cancel, null, null, 19); }); } else { - const handler = this.scene.ui.getHandler() as AwaitableUiHandler; - handler.tutorialActive = true; - this.scene.ui.showText(i18next.t("starterSelectUiHandler:invalidParty"), null, () => this.scene.ui.showText("", 0, () => handler.tutorialActive = false), null, true); + this.tutorialActive = true; + this.showText(i18next.t("starterSelectUiHandler:invalidParty"), undefined, () => this.showText("", 0, () => this.tutorialActive = false), undefined, true); } return true; } diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 2e05f3de4c1..63ef6155fbc 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -321,8 +321,12 @@ export default class SummaryUiHandler extends UiHandler { this.numberText.setText(Utils.padInt(this.pokemon.species.speciesId, 4)); this.numberText.setColor(this.getTextColor(!this.pokemon.isShiny() ? TextStyle.SUMMARY : TextStyle.SUMMARY_GOLD)); this.numberText.setShadowColor(this.getTextColor(!this.pokemon.isShiny() ? TextStyle.SUMMARY : TextStyle.SUMMARY_GOLD, true)); - - this.pokemonSprite.play(this.pokemon.getSpriteKey(true)); + const spriteKey = this.pokemon.getSpriteKey(true); + try { + this.pokemonSprite.play(spriteKey); + } catch (err: unknown) { + console.error(`Failed to play animation for ${spriteKey}`, err); + } this.pokemonSprite.setPipelineData("teraColor", getTypeRgb(this.pokemon.getTeraType())); this.pokemonSprite.setPipelineData("ignoreTimeTint", true); this.pokemonSprite.setPipelineData("spriteKey", this.pokemon.getSpriteKey());